제출 #1182705

#제출 시각아이디문제언어결과실행 시간메모리
11827058pete8Star Trek (CEOI20_startrek)C++20
45 / 100
150 ms20828 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f first
#define s second
#define pii pair<int32_t,int32_t>
#define ppii pair<int,pii>
#define vi vector<int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define F(n) for(int i=0;i<n;i++)
#define lb lower_bound
#define ub upper_bound
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#pragma GCC optimize ("03,unroll-lopps")
#define sz(x) (int)((x).size())
#define int long long
using namespace std;
const int mod=1e9+7,mxn=1e5,inf=1e18,minf=-1e18,lg=30,Mxn=1e9;
//#undef int
int n,k,m,d,q;
void setIO(string name){
	ios_base::sync_with_stdio(0); cin.tie(0);
	freopen((name+".in").c_str(),"r",stdin);
	freopen((name+".out").c_str(),"w",stdout);
}
int nim[mxn+10],nimu[mxn+10];
int nimr[mxn+10];

//rooted at, cur
vector<int>adj[mxn+10];
struct fen{
	int fwk[mxn+10];
	void update(int pos,int val){
		pos++;
		for(int i=pos;i<=n;i+=(i&-i))fwk[i]+=val;
	}
	int qry(int pos){
		pos++;
		int sum=0;
		for(int i=pos;i>0;i-=(i&-i))sum+=fwk[i];
		return sum;
	}
	int get(){
		int pos=0,sum=0;
		for(int i=lg;i>=0;i--)if(pos+(1LL<<i)<=n&&(sum+fwk[i+(1LL<<i)]==pos+(1LL<<i))){
			pos+=(1LL<<i);
			sum+=fwk[pos];
		}
		return pos;
	}
}t;
int mex(vector<int>have){
	sort(all(have));
	for(int i=0;i<have.size();i++){
		if(i==0||have[i-1]!=have[i])t.update(have[i],1);
	}
	int x=t.get();
	for(int i=0;i<have.size();i++){
		if(i==0||have[i-1]!=have[i])t.update(have[i],-1);
	}
	return x;
}
void dfs(int cur,int p){
	vector<int>have;
	for(auto i:adj[cur]){
		if(i==p)continue;
		dfs(i,cur);
		have.pb(nim[i]);
	}
	nim[cur]=mex(have);
}

int C[mxn+10];
void add(int x){
	if(!C[x])t.update(x,1);
	C[x]++;
}
void del(int x){
	C[x]--;
	if(!C[x])t.update(x,-1);
}
void dfs2(int cur,int p){
	if(p!=-1)add(nimu[cur]);
	for(auto i:adj[cur])if(i!=p)add(nim[i]);
	nimr[cur]=t.get();
	for(auto i:adj[cur])if(i!=p){
		if(C[nim[i]]==1)del(nim[i]);
		nimu[i]=t.get();
		if(!C[nim[i]])add(nim[i]);
	}
	for(auto i:adj[cur])if(i!=p)del(nim[i]);
	if(p!=-1)del(nimu[cur]);

	for(auto i:adj[cur])if(i!=p)dfs2(i,cur);
}


int D,cnt=0,ans=0;
void getans(int cur,int p,int dept,int yes){
	if(dept%2){
		//cnt 1
		for(auto i:adj[cur])if(i!=p)getans(i,cur,dept+1,yes);
		if(!yes)ans=(ans+cnt)%mod;
		else ans=(ans+n)%mod;
	}
	else{
		int x=0;
		//cnt 0
		for(auto i:adj[cur])if(i!=p)x+=(!nim[i]);
		for(auto i:adj[cur])if(i!=p){
			if(nim[i])getans(i,cur,dept+1,1);
			else getans(i,cur,dept+1,(yes||x>1));
		}
		ans=(ans+n)%mod;
	}
}
void getans2(int cur,int p,int dept,int yes){
	if(yes)return;
	if(dept%2){
		//cnt 1
		int x=0;
		for(auto i:adj[cur])if(i!=p)x+=(!nim[i]);
		for(auto i:adj[cur])if(i!=p){
			if(nim[i])getans2(i,cur,dept+1,1);
			else getans2(i,cur,dept+1,(yes|x>1));
		}
	}
	else{
		if(!yes)ans=(ans+n-cnt+mod)%mod;
		for(auto i:adj[cur])if(i!=p)getans2(i,cur,dept+1,yes);
	}
}
int pow(int ex){
	int ans=1,a=4;
	while(ex){
		if(ex&1)ans=(ans*a)%mod;
		a=(a*a)%mod;
		ex>>=1;
	}
	return ans;
}
int32_t main(){
	fastio
	cin>>n>>D;
	if(n==2){
		cout<<pow(D);
		return 0;
	}
	for(int i=1;i<n;i++){
		int a,b;cin>>a>>b;
		adj[a].pb(b);
		adj[b].pb(a);
	}
	dfs(1,-1);
	dfs2(1,-1);
	for(int i=1;i<=n;i++)if(nimr[i])cnt++;
	if(nim[1])getans(1,1,0,0);
	else getans2(1,1,0,0);
	cout<<ans;
}

컴파일 시 표준 에러 (stderr) 메시지

startrek.cpp:16:40: warning: bad option '-funroll-lopps' to pragma 'optimize' [-Wpragmas]
   16 | #pragma GCC optimize ("03,unroll-lopps")
      |                                        ^
startrek.cpp:23:23: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   23 | void setIO(string name){
      |                       ^
startrek.cpp:35:36: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   35 |         void update(int pos,int val){
      |                                    ^
startrek.cpp:39:24: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   39 |         int qry(int pos){
      |                        ^
startrek.cpp:45:17: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   45 |         int get(){
      |                 ^
startrek.cpp:54:24: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   54 | int mex(vector<int>have){
      |                        ^
startrek.cpp:65:23: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   65 | void dfs(int cur,int p){
      |                       ^
startrek.cpp:76:15: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   76 | void add(int x){
      |               ^
startrek.cpp:80:15: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   80 | void del(int x){
      |               ^
startrek.cpp:84:24: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   84 | void dfs2(int cur,int p){
      |                        ^
startrek.cpp:101:43: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
  101 | void getans(int cur,int p,int dept,int yes){
      |                                           ^
startrek.cpp:119:44: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
  119 | void getans2(int cur,int p,int dept,int yes){
      |                                            ^
startrek.cpp:135:15: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
  135 | int pow(int ex){
      |               ^
startrek.cpp:144:14: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
  144 | int32_t main(){
      |              ^
startrek.cpp: In function 'void setIO(std::string)':
startrek.cpp:25:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   25 |         freopen((name+".in").c_str(),"r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
startrek.cpp:26:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   26 |         freopen((name+".out").c_str(),"w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...