codeforces edutional Round

個人感覺edutional專場難度低於正常的比賽

做了幾個專場



Round 6:

這場比較簡單,我做了5個題,其中,E題是線段樹,非常簡單,可我不會線段樹,因此這題沒有做

以下是題目簡述

A,B簽到題

C剛開始我是用^來做的,結果發現1^2^3也能出來0,忘記之前是哪個奇怪的題了,或許是我沒注意使用條件//記性不好

然後用map做,不難,下面是代碼:

#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#define LL long long
const int maxn = 3*(1e5)  +  40 ;
using namespace std;
map<LL,LL>mp;
LL pos[maxn];
int main(){
    LL n;
    while(~scanf("%lld",&n)){
            mp.clear();
            pos[0]=0;
            LL t;
            LL ans=0;
        for(LL i=1;i<=n;i++){
            scanf("%lld",&t);
            if(mp.count(t)){
                mp.clear();
                pos[++ans]=i;
            }
            else {mp[t]=1;}
        }
        if(ans==0)printf("-1\n");
        else {
            printf("%lld\n",ans);
                if(pos[ans]==n){
                        for(LL i=0;i<ans;i++)printf("%lld %lld\n",pos[i]+1,pos[i+1]);


                }

                else {
                    for(LL i=0;i<ans-1;i++)printf("%lld %lld\n",pos[i]+1,pos[i+1]);
                    printf("%lld %lld\n",pos[ans-1]+1,n);
                }
        }
    }
}

D題挺有意思的,我是看別人的代碼,感覺確實考慮的挺好的

以下是代碼:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef pair<ll,ll> pll;
typedef vector<bool> vb;
const ll oo = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-9;
#define sz(c) ll((c).size())
#define all(c) begin(c), end(c)
#define FOR(i,a,b) for (ll i = (a); i < (b); i++)
#define FORD(i,a,b) for (ll i = (b)-1; i >= (a); i--)
#define mp make_pair
#define mt make_tuple
#define pb push_back
#define eb emplace_back
#define xx first
#define yy second
#define has(c,i) ((c).find(i) != end(c))
#define DBGDO(X) ({ if(1) cerr << "DBGDO: " << (#X) << " = " << (X) << endl; })

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	ll m, n; cin >> m;
	vl a(m);
	FOR(i,0,m) cin >> a[i];
	cin >> n;
	vl b(n);
	FOR(i,0,n) cin >> b[i];

	ll sum = 0;
	FOR(i,0,m) sum += a[i];
	FOR(i,0,n) sum -= b[i];

	ll best = abs(sum);
	vector<pll> bestv;

	FOR(i,0,m) FOR(j,0,n) {
		ll sw = 2*(a[i]-b[j]);
		if (abs(sum - sw) < best) {
			best = abs(sum - sw);
			bestv = {{i,j}};
		}
	}

	vector<pair<ll,pll> > aa, bb;
	FOR(i,0,m) FOR(j,i+1,m) aa.eb(a[i]+a[j],pll(i,j));
	FOR(i,0,n) FOR(j,i+1,n) bb.eb(b[i]+b[j],pll(i,j));
	sort(all(aa)), sort(all(bb));

	ll i = 0, j = 0;
	while (i < sz(aa) && j < sz(bb)) {
		ll cur = sum - 2*(aa[i].xx - bb[j].xx);
		if (abs(cur) < best) {
			best = abs(cur);
			bestv = {{aa[i].yy.xx,bb[j].yy.xx},{aa[i].yy.yy,bb[j].yy.yy}};
		}
		if (cur > 0) i++; else j++;
	}

	cout << best << endl;
	cout << sz(bestv) << endl;
	for (auto &p: bestv) cout << p.xx+1 << " " << p.yy+1 << endl;


}

F題,強制離線,不然會超時,我最初是在線做的,然後結果,自然是超時......

#include <bits/stdc++.h>
#define FOR(i,n,m) for(i=n;i<m;i++)
#define ll long long
const int maxn = 5*(1e5)  +  100;
using namespace std;
int a[maxn];
int b[1000000+50];
int f[1000000+50];
int g[1000000+50];
void deal(){
    f[1]=1;
    int i;
    FOR(i,2,1000010){
        f[i]=f[i-1]^i;
    }
}
struct gion{
    int from,to;

};
gion gs[maxn];
int best[maxn];
int main(){
    int m,n;
    deal();
    int i,j,k;
    while(~scanf("%d%d",&n,&m)){
        FOR(i,1,n+1){cin>>a[i];g[i]=f[a[i]];}
        FOR(i,0,m){
            ll l,r;
            cin>>l>>r;
            gs[i].from=l;
            gs[i].to=r;
            best[i]=-1;
        }
        FOR(i,1,n+1){
            int tmp=0;
            FOR(j,i,n+1){
                int cx=g[i]^g[j]^(a[i]>a[j]?a[j]:a[i]);
                tmp=max(tmp,cx);
                b[j]=tmp;
            }
            FOR(k,0,m){
                if(i>=gs[k].from&&i<=gs[k].to){
                    best[k]=max(best[k],b[gs[k].to]);
                }
            }

        }
        FOR(i,0,m)cout<<best[i]<<endl;
    }
}

Round 5:

A,B簽到題

C 我的神啊,我的dfs不知道是哪裏錯了,一直改不出來

這是我的dfs


#include <bits/stdc++.h>
#define FOR(i,n,m) for(int i=n;i<m;i++)
using namespace std;
const int maxn = 1000 + 50 ;
char ma[maxn][maxn];
int numb[maxn][maxn];
int ns[maxn][maxn];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int vis[1000*1000+40];

int vist[maxn][maxn];
int counts;
int m,n;
bool ok(int x,int y){
     if(x<0||x>=n||y<0||y>=m||ma[x][y]=='*')return false;
     return true;
}
void dfs(int x,int  y){
     FOR(k,0,4){
         int xx=x+dir[k][0],yy=y+dir[k][1];
         if(ok(xx,yy)&&vist[xx][yy]==-1){counts++;numb[xx][yy]=numb[x][y];vist[xx][yy]=1;dfs(xx,yy);ns[xx][yy]=counts;}
     }

}
int main(){

    while(~scanf("%d %d",&n,&m)){
        getchar();
        memset(vist,-1,sizeof(vist));
        memset(numb,-1,sizeof(numb));
        memset(ns,0,sizeof(ns));



        FOR(i,0,n)
            scanf("%s",&ma[i]);
        FOR(i,0,n)FOR(j,0,m)
           if(vist[i][j]==-1&&ma[i][j]=='.')
            {counts=1;numb[i][j]=i*m+j;vist[i][j]=1;dfs(i,j);ns[i][j]=counts;}

        FOR(i,0,n)FOR(j,0,m){
            if(ma[i][j]=='*'){
                    int cnt=1;
                    memset(vis,-1,sizeof(vis));
                    FOR(k,0,4){
                        int x=i+dir[k][0],y=j+dir[k][1];
                        if(ok(x,y)){
                            int t=numb[x][y];
                            if(vis[t]==-1){vis[t]=1;cnt+=ns[x][y];}
                        }

                    }
                    cnt%=10;
                    ma[i][j]=cnt+'0';
            }
        }
        FOR(i,0,n)printf("%s\n",ma[i]);
    }

}

這是正確的答案

#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 1010

using namespace std;

char map[MAXN][MAXN];
int mark[MAXN][MAXN],sum[MAXN*MAXN];
int dx[]={1,-1,0,0},dy[]={0,0,-1,1};
int m,n;

bool ok(int x,int y)
{
	if(0<=x&&x<n&&0<=y&&y<m&&map[x][y]=='.')
	return true;
	return false;
}

void dfs(int x,int y,int z)
{
	mark[x][y]=z;
	sum[z]++;
	for(int i=0;i<4;i++){
		int nx=x+dx[i],ny=y+dy[i];
		if(ok(nx,ny)&&mark[nx][ny]==0){
			dfs(nx,ny,z);
		}
	}
	return ;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++){
		scanf("%s",map[i]);
	}
	memset(mark,0,sizeof(mark));
	memset(sum,0,sizeof(sum));
	int cnt=1;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(map[i][j]=='.'&&mark[i][j]==0){
				dfs(i,j,cnt);
				cnt++;
			}
		}
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(map[i][j]=='.')printf(".");
			else{
				int num=1;
				for(int a=0;a<4;a++){
					int nx=i+dx[a],ny=j+dy[a];
					if(ok(nx,ny)){
						bool flag=true;
						for(int b=0;b<a;b++){
							int nnx=i+dx[b],nny=j+dy[b];
							if(mark[nx][ny]==mark[nnx][nny]){
								flag = false;
								break;
							}
						}
						if(flag){
							num+=sum[mark[nx][ny]];
						}
					}
				}
				num%=10;
				printf("%d",num);
			}
		}
		printf("\n");
	}
	return 0;
}

D map的應用,挺好玩,剛開始我以爲是dp

想了想,也沒找出轉移方程

#include <bits/stdc++.h>
#define FOR(i,n,m) for(int i=n;i<m;i++)
#define mem(c,b) memset(c,b,sizeof(c))
using namespace std;
const int maxn = 5*(1e5) + 40 ;
int num[maxn];
map<int,int>mp;
int main(){
    int n,k;
    while(~scanf("%d%d",&n,&k)){
            mp.clear();
        FOR(i,1,n+1)scanf("%d",&num[i]);
        int len=-1,ans,l=1,r=1,li=1,ri=1,sz;
        mp[num[1]]++;
        FOR(i,2,n+1){
            mp[num[i]]++;
            int sz=mp.size();
            if(sz==k+1){
                ans=ri-li+1;
                if(ans>len)len=ans,l=li,r=ri;
                while(sz>k){
                    mp[num[li]]--;
                    if(mp[num[li]]==0)mp.erase(num[li]);
                    li++;
                    sz=mp.size();
                }

            }
            ri=i;
        }
        ans=ri-li+1;
        if(ans>len)
            l=li,r=ri;
        printf("%d %d\n",l,r);

    }
}

E數論題:

來源見下


http://blog.csdn.net/qwe451255179/article/details/50531488



十分有意思

以下是代碼

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
int add(ll a, ll b) { return (a+b)%mod; }
int sub(ll a, ll b) { return ((a-b)%mod + mod)%mod; }
int mult(ll a, ll b) { return ((a%mod) * (b%mod))%mod; }

int main()
{
    ll i,n,m;
    cin>>n>>m;
    int ans = mult(n,m),sum = 0;
    m = min(n,m);
    for(i = 1;i <= m;i++){// l = i,r = n/(n/i);while:l <= x <= r ;n/x = n/i;
        ll r = n/(n/i);
        r = min(r,m);//if i>m for:n/i;
        ll sm = i + r,nm = r - i + 1;
        if(sm&1) sm = mult(sm,nm/2);// n/i!=n/x;
        else sm = mult(sm/2,nm);
        sum = add(sum,mult(sm,n/i));//floor(n/i)*i
        i = r;
    }
    ans = sub(ans,sum);
    cout<<ans;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章