個人感覺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;
}