C++ vector用法
阿新 • • 發佈:2021-07-14
A. math
一個簡單的找規律..考場上切了..
至此我們可以發現:很多數學題列舉找規律就能切切切切切!
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long int 4 #define lf double 5 #define mp make_pair 6 const ll N=1e6+50; 7 inline void read(ll &ss) 8 { 9 ss=0; bool cit=0; char ch; 10 while(!isdigit(ch=getchar())) ifA_Code(ch=='-') cit=1; 11 while(isdigit(ch)) ss=(ss<<3)+(ss<<1)+(ch^48),ch=getchar(); 12 if(cit) ss=-ss; 13 } 14 ll n,mod,sum,cnt; 15 ll val[N]; 16 ll gcd(ll a,ll b) 17 { 18 return b ? gcd(b,a%b) : a ; 19 } 20 signed main() 21 { 22 // freopen("1.in","r",stdin); 23 // freopen("out","w",stdout);24 read(n); read(mod); 25 ll temp=mod; 26 for(ll i=1;i<=n;i++) 27 { 28 read(val[i]); val[i]%=mod; 29 temp=gcd(temp,val[i]); 30 } 31 printf("%lld\n",mod/temp); 32 for(ll i=0;i<mod;i+=temp) 33 { 34 printf("%lld ",i); 35 } 36 return 0;37 } 38
但是這題根本沒有結束..!LRX大佬在考場上開啟測試資料之後發現:這道題的輸出資料竟然都是一個等差數列!?
於是 ta 打了一個隨機化列舉到 850ms 直接切了..超大資料都卡不過!!!
所以這裡再次安利隨機化演算法亦可玄學切切切..
B. biology
考場上打了一個記憶化搜尋,但是這題卡的有點緊,但還是從 爆搜40pts -> 記憶化 60pts ..
正解是一個 O(nm) 的 dp..
#include<bits/stdc++.h> using namespace std; #define ll long long int #define lf double #define mp make_pair const ll N=2e3+50; inline void read(ll &ss) { ss=0; bool cit=0; char ch; while(!isdigit(ch=getchar())) if(ch=='-') cit=1; while(isdigit(ch)) ss=(ss<<3)+(ss<<1)+(ch^48),ch=getchar(); if(cit) ss=-ss; } ll n,m,alls,ans; struct I { ll num,val,x,y; } a[N*N]; struct II { ll l,r; } b[N*N]; ll f[N][N],f1,f2,f3,f4; inline bool comp(I aa,I bb) { return aa.num==bb.num ? aa.val>bb.val : aa.num<bb.num ; } signed main() { read(n); read(m); for(ll i=1;i<=n;i++) { for(ll j=1;j<=m;j++) { read(a[i*n-n+j].num); a[i*n-n+j].x=i; a[i*n-n+j].y=j; } } for(ll i=1;i<=n;i++) { for(ll j=1;j<=m;j++) { read(a[i*n-n+j].val); } } sort(a+1,a+1+n*m,comp); for(ll i=1;i<=n*m;i++) { if(a[i].num!=a[i-1].num) { b[alls].r=i-1; b[++alls].l=i; } } b[alls].r=n*m; for(ll i=b[1].l;i<=b[1].r;i++) { f1=max(f1,a[i].val+a[i].x+a[i].y); f2=max(f2,a[i].val+a[i].x-a[i].y); f3=max(f3,a[i].val-a[i].x+a[i].y); f4=max(f4,a[i].val-a[i].x-a[i].y); } ll maxn,maxn1,maxn2; for(ll i=2;i<=alls;i++) { for(ll j=b[i].l;j<=b[i].r;j++) { maxn1=max(f1-a[j].x-a[j].y,f2-a[j].x+a[j].y); maxn2=max(f3+a[j].x-a[j].y,f4+a[j].x+a[j].y); maxn=max(maxn1,maxn2); f[a[j].x][a[j].y]=maxn+a[j].val; ans=max(ans,f[a[j].x][a[j].y]); } for(ll j=b[i].l;j<=b[i].r;j++) { f1=max(f1,f[a[j].x][a[j].y]+a[j].x+a[j].y); f2=max(f2,f[a[j].x][a[j].y]+a[j].x-a[j].y); f3=max(f3,f[a[j].x][a[j].y]-a[j].x+a[j].y); f4=max(f4,f[a[j].x][a[j].y]-a[j].x-a[j].y); } } printf("%lld",ans); return 0; } /* 3 3 0 6 8 1 6 1 0 6 8 0 1 2 3 4 5 0 6 7 */B_Code
C. english
咕咕咕,,