1. 程式人生 > 其它 >C++ vector用法

C++ vector用法

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())) if
(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
A_Code

但是這題根本沒有結束..!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

咕咕咕,,