codeforces:1361(div1)1362(div2):总结

文章目录

  • 前言
  • 1362-A. Johnny and Ancient Computer
    • 解析
  • 1362-B - Johnny and His Hobbies
    • 解析
  • 1362-C - Johnny and Another Rating Drop
    • 解析
  • 1361-A Johnny and Contribution
    • 解析
  • 1361-B - Johnny and Grandmaster
    • 解析
  • 1361-C - Johnny and Megan's Necklace
    • 解析
  • 1361-D - Johnny and James
    • 解析

前言

比昨天的题恶心亿点点
最后D题死活调不出来了整了两个半小时
qwq

1362-A. Johnny and Ancient Computer

给定 a,b,你可以把 aaa 的值设为以下几种之一:
a⋅2
a⋅4
a⋅8
a÷2(如果它被 2 整除)
a÷4(如果它被 4 整除)
a÷8(如果它被 8 整除)
求出至少需要几次操作才能把 a 变成 b。如果无解,输出 -1,表示这是不可能的。
多组数据,数据组数 t≤1000,1≤a,b≤1018t\leq 1000 ,1 \leq a,b\leq 10^{18}t1000,1a,b1018

解析

大水题
判断整除、除完一的个数后暴力数需要移动几位即可

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=2e5+100;
const int mod=998244353;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m,q;
int calc(ll x){return x?calc(x>>1)+1:0;}
signed main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifint T=read();while(T--){ll a=read(),b=read();if(a<b) swap(a,b);if(a%b) printf("-1\n");else{ll o=a/b;if(o!=(o&-o)) printf("-1\n");else printf("%d\n",(calc(o)+1)/3);}}return 0;
}

1362-B - Johnny and His Hobbies

有一个大小为 n 的集合 S={s1,s2,...,sn}S=\{s_1,s_2,...,s_n\}S={s1,s2,...,sn}。你需要求出一个最小的正整数 k,使得 {s1⊕k,s2⊕k,...,sn⊕k}=S\{s_1 \oplus k,s_2 \oplus k,...,s_n \oplus k\}=S{s1k,s2k,...,snk}=S
如果不存在这样的 k,输出 −1。
t≤1024,1≤n≤1024,∑n≤1024,0≤si<1024t \leq 1024,1 \leq n \leq 1024,\sum n \leq 1024,0 \leq s_i < 1024t1024,1n1024,n1024,0si<1024

解析

注意到数据范围很小,n方可以通过
暴力枚举aia_iai映射的值判断合法再取最小即可

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=1050;
const int mod=998244353;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m,q;
int a[N],bac[N];
signed main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifint T=read();while(T--){int res=1e9;n=read();memset(bac,0,sizeof(bac));for(int i=1;i<=n;i++) a[i]=read(),bac[a[i]]=1;for(int i=2;i<=n;i++){int o=a[1]^a[i],flag=1;for(int j=1;j<=n;j++){if(bac[a[j]^o]==0){flag=0;break;}}if(flag) res=min(res,o);}printf("%d\n",res<1e9?res:-1);}return 0;
}

1362-C - Johnny and Another Rating Drop

定义两个数的差异为它们在二进制下不同的位的数量(我们认为它们补充了足够的前导零)。
例如,0101 和 1110 的差异为 3
你需要求出 0,1,2,..,n−1,n0,1,2,..,n-1,n0,1,2,..,n1,n 中相邻的数的差异之和。
t≤10000t \leq 10000t100001≤n≤10181 \leq n \leq 10^{18}1n1018

解析

如果你没什么思路,给你看看他的样例:

n=5:
000
001
010
011
100
101

谜底写在谜面上
按位考虑即可

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=1050;
const int mod=998244353;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m,q;
ll mi[100];
signed main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifint T=read();mi[0]=1;for(int i=1;mi[i-1]<=1e18;i++) mi[i]=mi[i-1]<<1;while(T--){ll a=read(),res(0);for(int i=0;mi[i]<=a;i++){res+=(a+1+mi[i]-1)/mi[i]-1;}printf("%lld\n",res);}return 0;
}

1361-A Johnny and Contribution

给定 n 个点 m 条边的无向图。第 i 点被要求标上一个大小在 [1,n] 之间的正整数 tit_iti​。
在实际标数的过程中,操作者会按照一个特定的顺序 p1,p2,...,pnp_1,p_2,...,p_np1,p2,...,pn 来标数。
当给一个点 x 标数的时候,操作者会找到一个(最小的,在已经被标上数且与 x 相连的点中没有出现过的,)正整数 v,并把点 x 标上 v。
你需要求出 p1,p2,...,pnp_1,p_2,...,p_np1,p2,...,pn​,这样操作者标数之后,第 iii 个点会被标上 ti​t_i​ti
1≤n,m≤5⋅105,1≤ti≤n1 \leq n,m \leq 5\cdot 10^5,1 \leq t_i \leq n1n,m5105,1tin 无重边无自环

解析

直接从小到大考虑标记点,标记完把与它相连的打个标记即可
如果该点在自己的第k轮被打了标记或者之前打的标记次数少于k-1,就是无解
实现用时间戳标记,具体见代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=5e5+100;
const int mod=998244353;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;
struct node{int to,nxt;
}p[N<<1];
int fi[N],cnt;
inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;return;
}
vector<int>v[N];
int du[N],tim,tag[N];
int ans[N],tot;
signed main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifmemset(fi,-1,sizeof(fi));n=read();m=read();for(int i=1;i<=m;i++){int x=read(),y=read();addline(x,y);addline(y,x);}for(int i=1;i<=n;i++){v[read()].push_back(i);}for(tim=1;tim<=n;tim++){for(int i=0,o=v[tim].size();i<o;i++){int x=v[tim][i];if(tag[x]==tim||du[x]<tim-1){printf("-1\n");return 0;}ans[++tot]=x;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(tag[to]!=tim){tag[to]=tim;du[to]++;}}}}for(int i=1;i<=tot;i++) printf("%d ",ans[i]);return 0;
}

1361-B - Johnny and Grandmaster

给定 n,p 和 n 个形如 pkip^{k_i}pki的整数​,要求将这 n 个数分为两个集合,最小化两个集合的各自的和的差的绝对值,答案对 109+710^9+7109+7 取模。
∑n≤106,1≤p≤106,0≤ki≤106\sum n\le 10^6,1\le p\le 10^6,0\le k_i\le 10^6n106,1p106,0ki106

解析

不太难但挺有意思的贪心题
贪心策略:

从高到低位取,每次都尽可能最小化当前的差值

证明:
假设当前在第k位,没有最小化当前的差值
那么当前差值会增大 2∗pk2*p^k2pk
设[0,k-1]位的和为sumsumsum

  1. sum≥2∗pksum\geq 2*p^ksum2pk,那么显然后面需要把这个差值先补上来,那么我们不如不要这个差值,让补上来的两个pkp^kpk互相抵消,这样是不劣的
  2. sum≤2∗pksum\leq 2*p^ksum2pk,那么答案就会至少是pk−1p^{k-1}pk1,但是不难看出,如果不要这个差值,不难发现答案不会超过pk−1p^{k-1}pk1,所以是不优秀的

比较感性,但凑和看吧
后面的实现就不是很难了
主要你别和我一样伞兵换底公式倒错就行

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=2e6+100;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;
ll p;
int tag[N],tim,num[N];
vector<int> v;
inline void add(int id){if(tag[id]!=tim){tag[id]=tim;v.push_back(id);num[id]=1;}else num[id]++;return;
}
inline ll ksm(ll x,ll k){ll res(1);while(k){if(k&1) res=res*x%mod;x=x*x%mod;k>>=1;}return res;
}
ll calc(int k){ll res(0);for(int i=k;i>=0;i--) (res+=num[v[i]]*ksm(p,v[i]))%=mod;return res;
}
signed main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifint T=read();for(tim=1;tim<=T;tim++){v.clear();v.shrink_to_fit();  n=read();p=read();for(int i=1;i<=n;i++){int o=read();add(o);}sort(v.begin(),v.end());ll cnt(0);int flag(0);for(int i=v.size()-1;i>=0;i--){int x=v[i];if(num[x]>=cnt){num[x]-=cnt;cnt=num[x]&1;}else cnt-=num[x];if(i>0&&cnt){int d=v[i]-v[i-1];if(1.0*(log(n)-log(cnt))/log(p)<d){flag=1;printf("%lld\n",(cnt%mod*ksm(p,x)-calc(i-1)+mod)%mod);break;}else cnt*=ksm(p,d);}}if(!flag)printf("%lld\n",cnt%mod*ksm(p,v[0])%mod);}return 0;
}

1361-C - Johnny and Megan’s Necklace

n 对珍珠由 n 条线所连起来,共 2n 颗。现在你可以在任意两个未被线连起来的珍珠之间连一条线,共可连 n 条,使得这 2n 颗珍珠形成一个环。
设一条线所连的两颗珍珠权值为 u,v,则该线的权值为最大的整数 k 满足 2k∣uxor⁡v2^k∣u \operatorname{xor} v2kuxorv 。如果 u=v,则 k=20。
求所有新连的线的权值最小值的最大值并给出方案,即 2n 颗珍珠所形成的的环。

解析

关于最值,不难想到二分答案
对于一个给定的答案k,两颗珍珠可以连接当且仅当二者的[0,k-1]位完全相同
考虑把每一个长度为k的后缀建一个点,每颗珍珠向自己的伴侣和自己的后缀连一条边
然后跑欧拉回路即可

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=3e6+100;
const int mod=1e9+7;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;struct node{int to,nxt;
}p[N<<1];
int fi[N],cnt;
inline void addline(int x,int y){//printf("  addline:%d->%d\n",x,y);p[++cnt]=(node){y,fi[x]};fi[x]=cnt;return;
}int a[N],b[N];
int zhan[N],top;
bool jd[N];
int du[N];
void dfs(int x){//printf("dfs:%d\n",x);for(int i=fi[x];~i;i=fi[x]){int to=p[i].to;fi[x]=p[i].nxt;jd[i^1]=1;if(!jd[i]){//printf("%d->%d\n",x,to);dfs(to);}}zhan[++top]=x;
}
bool check(int k){int s=(1<<k)-1;memset(fi,-1,sizeof(fi));cnt=-1;memset(jd,0,sizeof(jd));memset(du,0,sizeof(du));for(int i=1;i<=n;i++){addline(2*i-1,2*i);addline(2*i,2*i-1);}int mx(0);for(int i=1;i<=n;i++){int x=a[i]&s,y=b[i]&s;++x;++y;//printf("\ni=%d x=%d y=%d\n",i,x,y);addline(2*i-1,2*n+x);addline(2*n+x,2*i-1);addline(2*i,2*n+y);addline(2*n+y,2*i);du[2*n+x]++;du[2*n+y]++;mx=max(mx,max(x,y));}for(int i=1;i<=mx;i++){if(du[i+2*n]&1) return false;}top=0;dfs(1);return top==3*n+1;
}
int main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifn=read();for(int i=1;i<=n;i++){a[i]=read();b[i]=read();}//printf("%d\n",check(3));//while(top) printf("%d ",zhan[top--]);//return 0;int st=0,ed=20;while(st<ed){int mid=(st+ed+1)>>1;if(check(mid)) st=mid;else ed=mid-1;}check(st);printf("%d\n",st);--top;while(top){if(zhan[top]<=2*n) printf("%d ",zhan[top]);--top;}return 0;
}

1361-D - Johnny and James

平面上给定 n 个互不相同的点,其中一个点是原点
建一棵树,原点为根,一个不为原点的点的父亲为其到原点的线段上的第二个点,边长即为到父亲的欧几里得距离
求选出 k 个不同的点,这些点两两距离和最大值
2≤k≤n≤5×1052 \le k \le n \le 5 \times 10^52kn5×105

解析

大毒瘤题…
是好几种方法都假掉了,又写了一堆bug
qwq
思路也不太好想

如果我们知道一条链上取的点的个数,我们应该取那些点呢?
对于前k/2个,由于链外的点更多,我们应该从下往上取,而对于超过k/2个,由于下方的点更多,我们应该从上往下取

所以我们可以分开来考虑增量
(设 x 到根的距离为 disxdis_xdisx
对于从下往上取的前k/2个:设其为从下往上第 i 个,那么它会往根连接 k−ik-iki 条边,产生(k−i)×disi(k-i) \times dis_i(ki)×disi 的贡献;同时,由于下方的所有点计算到i的路径时,本来是连向根的,现在变成连向 i ,因此又将付出 (i−1)×disi(i-1) \times dis_i(i1)×disi的代价。总的价值就是 (k−i−(i−1))×disi(k-i -(i-1)) \times dis_i(ki(i1))×disi

对于从上往下取的前k/2个:设其为从上往下第 i 个,那么它会往根连 k−k/2−(i−1)k-k/2-(i-1)kk/2(i1)条边(k/2是第一种情况的点),产生 (k−i)×disi(k-i) \times dis_i(ki)×disi的贡献;对于下方的点,和第一种情况类似的,也要付出(k/2)×disi(k/2) \times dis_i(k/2)×disi;同时,它的祖先们往i连边本来是当成向根连边计算的,但现在变成了连向 i 变化值是∑u∈ancestoridisi−disu−disu\sum_{u\in ancestor_i}dis_i-dis_u-dis_uuancestoridisidisudisu。因此,总的价值就是:(k−k/2−k/2+i−1)×disi−2×∑u∈ancestoridisu(k-k/2-k/2+i-1) \times dis_i-2 \times \sum_{u\in ancestor_i}dis_u(kk/2k/2+i1)×disi2×uancestoridisu

算出选取每个点的贡献,sort一下后取前k个即可

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=5e5+100;
const int mod=1e9+7;
const double eps=1e-9;
inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}ll gcd(ll x,ll y){ return y?gcd(y,x%y):x;}int n,m;
int rt;
map<int,map<int,int>>mp;
int bel[N],tot;
vector<int> v[N];
ll x[N],y[N];
double dep[N];
struct node{int to,nxt;double w;
}p[N<<1];
int fi[N],cnt;
inline void addline(int x,int y,double w){p[++cnt]=(node){y,fi[x],w};fi[x]=cnt;return;
}bool cmp(int x,int y){return dep[x]>dep[y];}
bool vis[N];
double q[N];
int num;
int main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifmemset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();for(int i=1;i<=n;i++){x[i]=read();y[i]=read();if(!x[i]&&!y[i]){rt=i;continue;}dep[i]=sqrt(x[i]*x[i]+y[i]*y[i]);int g=gcd(abs(x[i]),abs(y[i])),a=abs(x[i])/g,b=abs(y[i])/g;if(x[i]<0){//printf("ok a=%d\n",a);a=-a;}if(y[i]<0) b=-b;if(!x[i]) a=0,b=y[i]>0?1:-1;if(!y[i]) b=0,a=x[i]>0?1:-1;if(!mp[a][b]) mp[a][b]=++tot;int o=mp[a][b];bel[i]=o;v[o].push_back(i);//printf("i=%d bel=%d dep=%lf g=%d a=%d b=%d x[i]=%lld y[i]=%lld\n",i,bel[i],dep[i],g,a,b,x[i],y[i]);}v[++tot].push_back(rt);num=0;for(int o=1;o<=tot;o++){//printf("o=%d\n\n",o);int ww=v[o].size();sort(v[o].begin(),v[o].end(),cmp);for(int i=0;i<min(ww,m/2);i++){int x=v[o][i];q[++num]=(m-2*i-1)*dep[x];//printf("down:x=%d dep=%lf add=%lf\n",x,dep[x],(m-2*i-1)*dep[x]);}double sum(0);for(int i=ww-1;i>=m/2;i--){int x=v[o][i];q[++num]=(m-2*(m/2)-1)*dep[x]-2*sum;//printf("up:x=%d dep=%lf add=%lf\n",x,dep[x],(m-2*(m/2)-1)*dep[x]-2*sum);sum+=dep[x];}}double ans(0);sort(q+1,q+1+num);//for(int i=1;i<=num;i++) printf("%lf\n",q[i]);for(int i=num;m;i--,m--) ans+=q[i];printf("%.8lf\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018沈阳区域赛

题目地址 题号题目知识点难度ASockpuppetsBSequences GeneratorCInsertion Sort找规律&#xff0c;推公式DDiameter of a TreeEThe Kouga Ninja ScrollsFCounting Sheep in Ami DongsuoGBest ACMer Solves the Hardest Problem思维暴力HRainbow GraphIDistance Between Sweeth…

.NET和Java之争

这几天连续有多篇文章诋毁.NET&#xff0c;这类文章我十几年前就看得多了&#xff0c;只不过十几年前是C和C之争&#xff0c;C和Java之争。我从来不理这类文章&#xff0c;因为这类口水战并没有什么实际意义。然而接连收到多位粉丝私聊说&#xff0c;主席&#xff0c;你应该写点…

P8329-[ZJOI2022]树【容斥,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P8329 题目大意 有两棵nnn个点的有根树。 第一棵根为111&#xff0c;第iii个点的父亲在[1,i−1][1,i-1][1,i−1]中。第二棵根为nnn&#xff0c;第iii个点的父亲在[i1,n][i1,n][i1,n]中。每个点都恰好在一棵树中作为叶子。 …

线性代数一之矩阵转向量随机化求解——神奇的矩阵(BZOJ)+向量内积

向量随机化神奇的矩阵descriptionsolutioncode[NOI2013]向量内积descriptionsolutioncode矩阵既可以看成是一张数位表&#xff0c;也可以看成是若干个行向量或者若干个列向量的向量表神奇的矩阵 description solution 暴力做A∗BA*BA∗B会达到n3n^3n3的复杂度&#xff0c;难…

G - Best ACMer Solves the Hardest Problem Gym - 101955G

G - Best ACMer Solves the Hardest Problem Gym - 101955G 题意&#xff1a; 我们需要建立一个数据库以支持实时查询和修改。这个数据库中的记录是点坐标 (x,y) 和其权值 w。查询与修改操作可以表示为 1 x y w&#xff0c;在 (x,y) 处插入一个新的点&#xff0c;我们保证在…

模板:Link Cut Tree(LCT)

文章目录前言解析原理rotate(x)splay(x)access(x)findroot(x)makeroot(x)split(x,y)link(x,y)cut(x,y)pushdown(x)完整代码所谓Link Cut Tree&#xff0c;就是林可卡特发明的tree &#xff08;逃&#xff09; 前言 终于走到了这一天… 其实感觉没有预想的那么难&#xff08;单…

P6803-[CEOI2020]星际迷航【博弈论,dp,矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/P6803 题目大意 给出一棵nnn个点的树&#xff0c;把它复制出D1D1D1层&#xff0c;编号为[0,D][0,D][0,D]&#xff0c;然后每一层随机一个点向下一层随机一个点连边。 然后从第000层的111号点出发&#xff0c;两个人轮流操作…

潘淳:国士无双《微软技术俱乐部(苏州)成立大会暨微软技术交流会介绍》附专题视频...

题记&#xff1a;凡我赶不上的&#xff0c;我就在未来等他&#xff0c;随时等待捕捉那个趋势的的到来。2019年立一个FLAG&#xff0c;加入一个成长性组织&#xff0c;一个能让我学习使我成长的平台。2019年你和我都将亲历这个组织的到来&#xff0c;一个属于苏州程序员自己的大…

ASP.NET Core中借助CSRedis实现安全高效的分布式锁

引言最近回头看了看开发的.NET Core 2.1项目的复盘总结&#xff0c;其中在多处用到Redis实现的分布式锁&#xff0c;虽然在OnResultExecuting方法中做了防止死锁的处理&#xff0c;但在某些场景下还是会发生死锁的问题&#xff0c;下面我只展示部分代码&#xff1a;问题&#x…

L Machining Disc Rotors

L Machining Disc Rotors 题意&#xff1a; 圆心为(0,0)半径为R的圆&#xff0c;现在被被n个互不相交的圆切割(圆心和半径会给出)&#xff0c;保证这n个彼此之间不会交叉&#xff0c;保证n个圆中不会有某个包含整个大圆的情况。问切割后大圆剩余部分的直径&#xff08;即两点…

线性代数二之矩阵加速DP——数学作业,Arc of Dream

矩阵加速数学作业descriptionsolutioncodeArc of Dreamdescriptionsolutioncode数学作业 description solution dpdpdp状态转移方程&#xff0c;dpidpi−1∗10lenii(modM)dp_{i}dp_{i-1}*10^{len_i}i\pmod Mdpi​dpi−1​∗10leni​i(modM) nnn巨大&#xff0c;分段矩阵加速 …

pjudge#21655-[PR #5]双向奔赴【状压dp】

正题 题目链接:http://pjudge.ac/contest/951/problem/21655 题目大意 给出一张nnn个点的简单无向图&#xff0c;每条边的两个方向具有不同权值。求一个权值和最小的定向方案使得整张图强连通。 1≤n≤18,−1≤ai,j≤1061\leq n\leq 18,-1\leq a_{i,j}\leq 10^61≤n≤18,−1≤…

YBTOJ洛谷P2387: 魔法森林(LCT)

解析 LCT从板子到算法的入门题吧 有一些不知道的很实用的技巧 把边按a排序从小到大加入边 那么我们只需要维护当前1-n路径上的b的最小值即可 如果这条边两端点本来不连通&#xff0c;就直接link 否则找到路径上b最大的一条边&#xff0c;断掉&#xff0c;再加入当前边&#x…

Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】

接着上一篇Shadow Properties之美&#xff08;一&#xff09;&#xff0c;我们来继续举一个有点啰嗦的栗子。先看简单需求&#xff1a;某HR系统&#xff0c;需要记录员工资料。需要记录的资料有&#xff1a;员工号&#xff08;规则&#xff1a;分公司所在城市拼音首字母&#x…

K - Let the Flames Begin

K - Let the Flames Begin 题意&#xff1a; n个人围成一个环&#xff0c;编号分别是1~n&#xff0c;从第一个人开始报数&#xff0c;报道k的人被移除&#xff0c;然后下一个人从1重新报&#xff0c;一直这样进行。问第m给被移除的人报数是多少&#xff1f; 一共T组数据&…

CF1276F-Asterisk Substrings【SAM,线段树合并】

正题 题目链接:https://www.luogu.com.cn/problem/CF1276F 题目大意 给出一个长度为nnn的字符串SSS&#xff0c;现在依次进行如下操作 取出SSS的一个子串TTT。将TTT中的一个字符替换成∗*∗号&#xff08;也可以不替换&#xff09; 求最后有多少种不同的TTT。 解题思路 发…

线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路

状压与矩阵加速的藕断丝连Quad Tilingdescriptionsolutioncode[Hnoi2010]Bus 公交线路descriptionsolutioncodeQuad Tiling description solution 设dpi,S:dp_{i,S}:dpi,S​: iii列的状态为SSS的方案数&#xff0c;最后答案为dpn,(1<<4)−1dp_{n,(1<<4)-1}dpn,(…

codeforces:812(div2):总结

前言 比较水的一场比赛 E题几乎是一本通原题而我还是不会做qwq A - Sagheer and Crossroads 有一个十字路口&#xff0c;给出四个路口的车是否可以左转/右转/直行&#xff0c;并且给出每个路口的行人是否可以通过&#xff0c;求是否出现车和人冲突的情况 阅读理解题&#xff…

如何在ASP.NET Core程序启动时运行异步任务(2)

原文&#xff1a;Running async tasks on app startup in ASP.NET Core (Part 2)作者&#xff1a;Andrew Lock译者&#xff1a;Lamond Lu在我的上一篇博客中&#xff0c;我介绍了如何在ASP.NET Core应用程序启动时运行一些一次性异步任务。本篇博客将继续讨论上一篇的内容&…

Gym 102798A Golden Spirit

VJ链接 题意&#xff1a; 河的两岸各有n个人&#xff0c;中间有个桥&#xff0c;过桥时间为t&#xff0c;所有人过桥后要休息x时间&#xff0c;你每次可以带一个人过桥&#xff08;每次最多只能带一个人&#xff09;&#xff0c;问将所有人带到对岸并带回来&#xff0c;最短需…