不 要 像 这 样 写 循 环 展 开
你的循环展开是真的吗?
正确写法:
12345678910111213141516171819202122232425262728#include<bits/stdc++.h>using namespace std;int a[150005],n=120000;int solve(){ long long sum1=rand()%n+1,sum2=rand()%n+1,sum3=rand()%n+1,sum4=rand()%n+1,sum5=rand()%n+1,sum6=rand()%n+1,sum7=rand()%n+1,sum8=rand()%n+1; for(int i=0;i+8<=n;i+=8){ sum1+=a[i+1];sum2+=a[i+2];sum3+=a[i+3];sum4+=a[i+4]; sum5+=a[i+5];sum6+=a[i+6];sum7+=a[i+7];sum8+=a[i+8]; } switch(n&7){ case ...
10-15鲜花(脱敏版)
464deab8b6d56d95d4a368729c99b842b9ac5bb2fe939b028b4786d1b252d28627b3e51349e1d83cc166f11a5be64d6ecaf4374538dedb024d06fe0954b152a86884ef191754e1b56bc782ae04dfd523ccca41fd90d12484ec81564e8305102b7d1b338f0b323e75354dd8dfc7ccbefc08ed3dc43de9a8cb8a1f9dff33a9304507f9c2342844f9eb3e7d2ec22bd82fb136e13144b7a905174afed57c785985441585949f57c08953e477f8700a8b167cd341d77b5139d831f5e9ee1a768fd2d1c22b7cfffd73002162e453b6d1d6f7b9b9c327a4c1d523903d6c32e05a14c5db652e4e332b479384787901e48da74554dc0862ee86fa9ca70 ...
CF1305F Kuroni and the Punishment
你考虑一件事,就是说改变次数 $\geq \lfloor \frac{n}{2} \rfloor$ 的数最多有 $\lfloor \frac{n}{2} \rfloor$ 个,证明较为简单。
所以我们得到了一个算法:你直接在数列里随50个数,然后把它、它 $+1$、它 $-1$ 这三个数分解质因数扔到一个set里。对于每一个set的里元素,暴力求解即可。
你考虑正确率。每次随机一个元素,它被操作了的概率是 $\frac 1 2$,所以你随机 $50$ 次的正确率是:$\frac{1}{2^{50}}$。
1234567891011121314151617181920212223242526272829303132333435363738394041424344#include<bits/stdc++.h>using namespace std;#define ll long longll p[1000005],v[1000005],n,m,a[1000006],mx=10,cnt,k,ans=1e9;mt19937 rd((unsigned long long)new ch ...
CF1198C Matching vs Independent Set
多测。所以少随几遍,反正正确率特别高。
考虑每组数据随20次点独立集,随20次边独立集。
随机方式应该是很经典的,随机打乱顺序之后直接贪心就行了。
因为它只要求到三分之一大小,所以还是很容易得出结论的。另外这题好像一定有解。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include<bits/stdc++.h>using namespace std;mt19937 rd((unsigned long long)new char);int n,m,a[800005],vis[800005],ans[800005],tot;pair<int,int> p[600005];vector<int> g[300005];int main(){ ios::sync_with_stdio(0); int T;cin>>T; while(T--){ cin&g ...
P1452 [UASCO03FALL] Beauty Contest G
旋转卡壳板子(平面最近点对)。随便乱做就能过了。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149#include<bits/stdc++.h>using namespace std;const double eps=1e-8,PI=acos(-1.0);struct point{ double x,y; point(double u ...
P7999
令 $m$ 为不超过 $\lfloor \frac{n}{2} \rfloor$ 的最大奇数。
对前一半 $(1 \sim \lfloor \frac{n}{2} \rfloor)$,首先用 $m+1$ 的反转归位,到了当前位置离目标位置小于 $m+1$ 的时候,把他反转到目标 $+m$ 的位置。
对于后半部分,考虑交换任意 $u$ 和 $v$ 的位置。
你考虑同时操作 $m+1$ 和 $m-1$ 可以仅交换 $i$ 和 $i+m$ 位置上的值。
所以,当 $v$ 不等于 $u+m$ 的时候,先把他扔到 $[u,u+m]$ 里,如果他俩奇偶性不同,则执行一次交换让他俩奇偶性相同。
然后,你就直接找到一个中点反转,就能归位了。
题解做法好像反过来了
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283#include<bit ...
USACO2008 Cow Neighbourhoods
按照x坐标排序,然后对于每个点查他后面2750个点就行了。
123456789101112131415161718192021222324252627282930313233343536373839404142434445#include<bits/stdc++.h>using namespace std;#define ll long longll n,c;struct node{ ll x,y;}a[100005];bool cmp1(node x,node y){return x.x*x.y<y.x*y.y;}bool cmp2(node x,node y){return x.x<y.x;}int fa[100005],buc[100005],rk[100005];ll find(ll x){ if(fa[x]==x)return fa[x]; return fa[x]=find(fa[x]);}void unit(int x,int y){ ...
CF338D GCD Table
正解ExCRT,但是不想写。
考虑做一坨特判:
1、如果k>m,显然不行。
2、如果a数组的最小公倍数比n大,那显然也不行。
3、如果a数组有比m大的值,那肯定也不行。
4、其他看代码。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lll __int128
#define itn int
ll n,m,k;
lll a[100005];
lll lcm(lll a,lll b){return a/__gcd(a,b)*b;}
int main(){
cin>>n>>m>>k;lll ans=1;
// if(m>=1e11&&m<=5e11&&k<=5){cout<<"NO\n";return 0;}
if(k>m){cout<<"NO\n ...
蓝桥杯 图形排版
随一个顺序然后卡时跑暴力即可。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465#include<bits/stdc++.h>using namespace std;struct node{ int x,y,id;}a[100005];vector<node> b[100005],c[100005];bool cmpx(node x,node y){ return x.x<y.y;}bool cmpy(node x,node y){ return x.y<y.y;}mt19937 rd(43678902);int n,m,len[105],cnt=1,id[100005];long long calc(int banid){ long long res=0; f ...
Topcoder TPS
首先有一个很傻逼的结论:只有叶子节点可能放,证明显然。所以你把叶子节点全拎出来,二分答案,判断就随一万遍随机顺序放置TPS。然后每次暴力判断就过了。时间复杂度:$O(Tn^3 \log n)$,但是可以过。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566#include<bits/stdc++.h>using namespace std;vector<int> v[65];int n,vis[55],one[105],tot,ch[51],g[51][51];vector<int> d[65];bool check2(int mid){ for(int i=1;i<=n;++i)d[i].clear(); for(int i=1;i<=n;++i){ for(int j=1;j<=mid;+ ...