原题J 找规律一开始思路错了光看给的图以为x取整数点y在整数之间就算超过一半了忽略了另一个交正方形的点反例如a1,b999所以x看的是0.5处的点可以把坐标轴*2避免使用doublevoidsolve(){intna,nb;cinnanb;intamax(na,nb),bmin(na,nb);intsm0;for(inti1;i2*a;i2){inthd4*b*a-2*b*i;inttophd/(2*a);// couttop ;sm(top1)/2;}coutsmendl;}M 题意理解只要被按下就会触发后面一连串的操作如果这个按下是被触发的也会触发对应的一连串所以按下1后触发的小连招包含x结束后再主动按x又会和之前的连招抵消。所以只有1是开的D 枚举 调和奇数 正难则反 等差数列等差数列需要确定首相a 1 a_1a1​和公差k kk枚举然后遍历找答案必然超时遍历找要改的数很浪费正难则反确定不用改的数。最小花多少就等于最大省多少。枚举每个位置为不变枚举公差k从a i ≤ 10 6 a_i\leq 10^6ai​≤106k ≤ a i i − 1 ≤ 10 6 i − 1 k\leq \frac{a_i}{i-1}\leq \frac{10^6}{i-1}k≤i−1ai​​≤i−1106​由调和级数k总共最多枚举10 6 l o g n ≈ 2 e 7 10^6logn\approx 2e7106logn≈2e7voidsolve(){intn;cinn;vectorinta(n1),b(n1);forr(i,1,n)cina[i];intbsm0;forr(i,1,n)cinb[i],bsmb[i];mappii,intmatch;forr(i,1,n){forr(k,0,(1e6/i)){inta1a[i]-(i-1)*k;if(a10){match[{a1,k}]b[i];}}}intmx0;for(auto[k,v]:match){mxmax(mx,v);}coutbsm-mxendl;}F 博弈看到样例可以猜一手跟奇偶性有关发现每位最后一个操作的必能把这一位变成自己想要的数拿到这一位voidsolve(){intk,z;cinkz;vectorintb(k1),ans(k1,0);vectorintcnt1;// 记录b1的地方 AB两人轮流取intc0,c10;// c是b2的b位奇数个数 c1是b1的个数forr(i,0,k-1){cinb[i];if(b[i]1){cnt1.push_back(i);c1;}elseif(b[i]0)ans[i]0;elseif(b[i]1){c;}}/* c1: - 奇数取完b1之后B先手 - 偶数之后A先手 z: - 奇改变先后手 - 偶不变 c: - 偶后手一直演先手,能保证奇数个每个位置都是后手最后拿捏偶数个部分先手先拿后手最后拿 后手都能拿到 - 奇先手比后手多一个能取到最后拿捏的位置偶数个部分后手先拿 先手都能拿到 */sort(cnt1.begin(),cnt1.end(),greaterint());forr(i,0,c1-1){if(i%20)ans[cnt1[i]]1;// b1 AB一轮轮争抢}if((c1cz)%2){// 三者之和为奇 A最后一个操作 所有b2的都能拿到forr(i,0,k-1)if(b[i]2)ans[i]1;}reforr(i,0,k-1)coutans[i];coutendl;}L 状压 哈希暴力规模能达到1e10超时因为s长度只有5可以状压枚举每个位置是否匹配然后记录每个状态的字符串情况告诉的和询问的进行匹配找最大相似度的最小编号但是用map记录字符串会TLE退化到了O(n)使用字符串哈希记录数值// unordered_mapstring,intrec; TLEvectorintrec(N,inf);// int最大能开536698431// vectorstringc_vec[25][6];// int similar(string a,string b){// int res0;// forr(i,0,min(a.size(),b.size())-1){// if(a[i]!b[i])break;// else res;// }// return res;// }voidsolve(){intq;cinq;/* 暴力 forr(i,1,q){ int op;cinop; if(op1){ string s;int x; cinsx; rec[s]x; }else { string s; cins; int mx0;string aim; for(auto [ss,v]:rec){// 1e5*1e5超时 int nowsimilar(ss,s); if(nowmx)aimss,mxnow; } } } */forr(i,1,q){intop;cinop;if(op1){/* 利用|s|5 枚举可能的匹配情况 量化匹配度 状压 */string s;intx;cinsx;/* forr(i,0,31){ string now;// 用字符串匹配会TLE 所以使用vector存hash值 forr(j,0,s.size()-1){ // 1:匹配 0:不匹配 if((ij)1){ nows[j]; }else now#; } if(!rec[now]||rec[now]x)rec[now]x;// 记录固定匹配度 最小编号 } */forr(i,0,31){intval0,p1;forr(j,0,s.size()-1){// 1:匹配 0:不匹配intnow((ij)1)*(s[j]-a1);// a~z 1~26valnow*p;p*27;}rec[val]min(rec[val],x);}}else{string s;cins;// int sim_mx0,ans1;intsim_mx-1,ans1;// sim_mx可能最后最大为0/* forr(i,0,31){ string now; int sim0; forr(j,0,s.size()-1){ // 1:匹配 0:不匹配 if((ij)1){ nows[j]; sim; }else now#; } if(simsim_mxrec.count(now))ansrec[now]; } */forr(i,0,31){intsim0,val0,p1;forr(j,0,s.size()-1){intnow((ij)1)*(s[j]-a1);valnow*p;p*27;sim((ij)1);}if(rec[val]!inf){if(simsim_mx)ansrec[val],sim_mxsim;elseif(simsim_mx)ansmin(ans,rec[val]);// 找同匹配数下更小的}}coutansendl;}}}