ACM ICPC 2017 Warmup Contest 1 (NCPC 2016)

来源:互联网 发布:安卓sd卡数据恢复软件 编辑:程序博客网 时间:2024/06/05 17:15

A Artwork

倒跑并查集

#include<bits/stdc++.h> using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=pre[x];p;p=next[p])#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,0x3f,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define MEMx(a,b) memset(a,b,sizeof(a));#define INF (0x3f3f3f3f)#define F (1000000007)#define pb push_back#define mp make_pair#define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;#define PRi2D(a,n,m) For(i,n) { \                        For(j,m-1) cout<<a[i][j]<<' ';\                        cout<<a[i][m]<<endl; \                        } #pragma comment(linker, "/STACK:102400000,102400000")#define ALL(x) (x).begin(),(x).end()#define gmax(a,b) a=max(a,b);#define gmin(a,b) a=min(a,b);typedef long long ll;typedef long double ld;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return ((a-b)%F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}inline int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} #define MAXN (1010)#define MAXQ (10000+10)int n,m,q;class bingchaji{public:    int father[MAXN*MAXN],n,cnt;    void mem(int _n)    {        n=cnt=_n;        For(i,n) father[i]=i;    }    int getfather(int x)     {        if (father[x]==x) return x;        return father[x]=getfather(father[x]);    }    void unite(int x,int y)    {        x=getfather(x);        y=getfather(y);        if (x^y) {            --cnt;            father[x]=y;        }    }    bool same(int x,int y)    {        return getfather(x)==getfather(y);    }}S;pair< pi ,pi > q1[MAXQ];int a[MAXN][MAXN];int dx[4]={1,0,-1,0};int dy[4]={0,1,0,-1};bool inside(int x,int y){return 1<=x&&x<=n&&1<=y&&y<=m;}int an[MAXQ];int id(int x,int y) {return (x-1)*m+y;}int las[MAXN][MAXN];int main(){//  freopen("A.in","r",stdin);//  freopen(".out","w",stdout);    cin>>n>>m>>q;    S.mem(n*m);    MEM(las)    MEM(a)    For(i,q) {        q1[i].fi.fi=read();        q1[i].fi.se=read();        q1[i].se.fi=read();        q1[i].se.se=read();        Fork(x,q1[i].fi.fi,q1[i].se.fi)  Fork(y,q1[i].fi.se,q1[i].se.se) {            a[x][y]=1;            if (!las[x][y])las[x][y]=i;        }    }    For(x,n) For(y,m) {        if (inside(x+1,y)&&!a[x][y]&&!a[x+1][y]) S.unite(id(x+1,y),id(x,y));        if (inside(x,y+1)&&!a[x][y]&&!a[x][y+1]) S.unite(id(x,y+1),id(x,y));    }    int ans=0;    For(x,n) For(y,m) if (S.getfather(id(x,y))==id(x,y)&&!a[x][y] ) {        ++ans;    }    ForD(i,q) {        an[i]=ans;        Fork(x,q1[i].fi.fi,q1[i].se.fi)  Fork(y,q1[i].fi.se,q1[i].se.se) if (a[x][y]&&las[x][y]==i){            a[x][y]=0;            ans++;            Rep(di,4) {                int x2=x+dx[di],y2=y+dy[di];                if (inside(x2,y2)&&!a[x][y]&&!a[x2][y2]) {                    if (!S.same(id(x,y),id(x2,y2))) {                        S.unite(id(x2,y2),id(x,y));                        ans--;                    }                }            }//          cout<<ans<<' ';        }//      cout<<endl;    }    For(i,q) printf("%d\n",an[i]);    return 0;}

Bless You Autocorrect!

建trie树,二分hashLcp

Card Hand Sorting

暴力

#include<bits/stdc++.h> using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=pre[x];p;p=next[p])#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,0x3f,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define MEMx(a,b) memset(a,b,sizeof(a));#define INF (0x3f3f3f3f)#define F (1000000007)#define pb push_back#define mp make_pair#define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;#define PRi2D(a,n,m) For(i,n) { \                        For(j,m-1) cout<<a[i][j]<<' ';\                        cout<<a[i][m]<<endl; \                        } #pragma comment(linker, "/STACK:102400000,102400000")#define ALL(x) (x).begin(),(x).end()#define gmax(a,b) a=max(a,b);#define gmin(a,b) a=min(a,b);typedef long long ll;typedef long double ld;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return ((a-b)%F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}inline int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} char l[100]="23456789TJQKA";char s[100]="shdc";int h1[10000],h2[10000];namespace LIS{    #define MAXN (60)    int n,a[MAXN],d[MAXN],f[MAXN],len=0;      void LIS()      {          memset(d,128,sizeof(d));          d[len=0]=INF;          ForD(i,n)          {              int l=0,r=len,ans=0;              while (l<=r)              {                  int m=l+r>>1;                  if (a[i]<d[m]) ans=m,l=m+1;                  else r=m-1;              }              f[i]=ans+1;len=max(len,f[i]);              d[f[i]]=max(d[f[i]],a[i]);                }      }  }pi p[MAXN];int pe[4]={0,1,2,3};int main(){//  freopen("C.in","r",stdin);//  freopen(".out","w",stdout);    int n=read();    Rep(i,13) h1[l[i]]=i;    Rep(i,4) h2[s[i]]=i;    For(i,n) {        char s[10];        scanf("%s",s);        p[i]=mp(s[0],s[1]);    }    int ans=0;    LIS::n=n;    do{        Rep(st,1<<4) {            For(i,n) {                int sp=h2[p[i].se];                if ((st>>sp)&1)                    LIS::a[i] = h1[p[i].fi] + pe[h2[p[i].se]]*13;                else {                    LIS::a[i] = 12 - h1[p[i].fi] + pe[h2[p[i].se]]*13;                }            }            LIS::LIS();            gmax(ans,LIS::len);        }    }while(next_permutation(pe,pe+4));    cout<<n-ans<<endl;    return 0;}

Daydreaming Stockbroker

E Exponial

扩展欧拉公式
广义欧拉定理
于同余式a^b≡x(mod m),如何求出x?(1<=a,m<=1000000000,1<=b<=10^1000000)
注意到b很大,我们可以先采取一些方法降幂。
若gcd(a,m)=1,那么使用欧拉定理即可:a^b≡a^(b%φ(m))(mod m)
若gcd(a,m)>1,且b>φ(m),则有“求幂大法”——a^b≡a^(b%φ(m)+φ(m))(mod m)
(当b<=φ(m)时直接用快速幂即可)

Keeping the Dogs Apart

2只dog分别在2折线上以相同速度跑,直到其中1只跑到终点(包括端点)的这段时间里2只dog最远距离?

#include<bits/stdc++.h>#include<quadmath.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define ALL(x) (x).begin(),(x).end()typedef long long ll;typedef __float128 ld;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} ll sqr(ll a){return a*a;}ld sqr(ld a){return a*a;}const __float128 eps=1e-10;#define fabsq(x) max(x,-x)int dcmp(__float128 x) {    if (fabsq(x)<eps) return 0; else return x<0 ? -1 : 1; }ld PI = 3.141592653589793238462643383;class P{public:    __float128 x,y;    P(__float128 x=0,__float128 y=0):x(x),y(y){}    friend ld dis2(P A,P B){return sqr(A.x-B.x)+sqr(A.y-B.y);   }    friend ld Dot(P A,P B) {return A.x*B.x+A.y*B.y; }    friend ld Length(P A) {return (__float128)sqrt((double)Dot(A,A)); }    friend P operator- (P A,P B) { return P(A.x-B.x,A.y-B.y); }    friend P operator+ (P A,P B) { return P(A.x+B.x,A.y+B.y); }    friend P operator* (P A,__float128 p) { return P(A.x*p,A.y*p); }    friend P operator/ (P A,__float128 p) { return P(A.x/p,A.y/p); }    friend bool operator< (const P& a,const P& b) {return dcmp(a.x-b.x)<0 ||(dcmp(a.x-b.x)==0&& dcmp(a.y-b.y)<0 );}}; P read_point() {    double ax,ay;    scanf("%lf%lf",&ax,&ay);    P a=P(ax,ay);    return a;   } bool operator==(const P& a,const P& b) {    return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y) == 0;} typedef P V;__float128 Cross(V A,V B) {return A.x*B.y - A.y*B.x;}__float128 DistanceToSegment(P p,P A,P B) {    if (A==B) return Length(p-A);    V v1 = B-A, v2 = p-A, v3 = p - B;    if (dcmp(Dot(v1,v2))<0) return Length(v2);    else if (dcmp(Dot(v1,v3))>0 ) return Length(v3);    else return fabsq(Cross(v1,v2) ) / Length(v1);}int n,m;#define MAXN (120000)P a[MAXN],b[MAXN];__float128 t1[MAXN]={},t2[MAXN]={};int main(){//  freopen("K.in","r",stdin);//  freopen(".out","w",stdout);    n=read();    For(i,n) {        a[i]=read_point();    }    Fork(i,2,n) {        t1[i]=Length(a[i]-a[i-1])+t1[i-1];    }    m=read();    For(i,m) {        b[i]=read_point();      }    Fork(i,2,m) {        t2[i]=Length(b[i]-b[i-1])+t2[i-1];    }    int l1=1,l2=1;    __float128 nowt=0;    P A(b[1]-a[1]);    __float128 ans=Length(A),t;    while(l1<n&&l2<m) {        if (t1[l1+1]<t2[l2+1]) {            t=t1[l1+1]-nowt;            P B=A+ (b[l2+1]-b[l2])*t/Length(b[l2+1]-b[l2])- (a[l1+1]-a[l1])*t/Length(a[l1+1]-a[l1]);            ans = min(ans ,DistanceToSegment(P(0,0), A,B )  );            nowt=t1[++l1];            A=B;        } else {            t=t2[l2+1]-nowt;            P B=A+ (b[l2+1]-b[l2])*t/Length(b[l2+1]-b[l2])- (a[l1+1]-a[l1])*t/Length(a[l1+1]-a[l1]);            ans = min(ans ,DistanceToSegment(P(0,0), A,B )  );            nowt=t2[++l2];            A=B;        }    }    printf("%.12lf\n",(double)ans);    return 0;}
阅读全文
0 0