话说国庆大假,11:30寝室终于有电了呀。
满心欢喜的做了一发cf,没想到system test挂得这么惨
A:签到题
B:打出素数表,将素数表的素数平方,然后读入询问的数二分就行了
C:先预处理。 预处理出将 i行j列 置为1需要的最小步数。
D:最短路,spfa,dijkstra神马的都可以搞,不过题目有个啃爹的限制,每个点有些时间点不能通过,其实只需要松弛操作的时候先算出distance[V],然后判断distan[V]是否可以通过,不能就把distance[V]加到可以通过为止。简单的枚举———将distance[V]每次加1会超时,所以每次在读入数据的时候需要先预处理一下,话说这道题我居然挂在了67组,一共才68组呀,因为distance初始化的时候将它赋值成了1000000000,答案其实会超过这么多的。简单的改成1010000000就A了。 还需要注意一点的就是起点也有时间点不能pass滴哟,到了终点就不用管终点不能pass的时间点了~~~
E:题目问你一个无向图和它的补图中一共有几个三元环。 首先如果是一个n个顶点的完全图 就应该有n*(n-1)*(n-2)/6个三元环吧。 所以只需要求出少去的环就可以了。 考虑任意一个点u, 假如在给的无向图中有x个点能到u,那么剩下的 (n-1-x)个点就不能到u了,那么以u为中间点的三元环就少点了 x*(n-1-x)个,按照这个思路想想就没什么了。最后代码不过20行。
A:
#include<stdio.h>
#include<string.h>
#include <cmath>
#include<algorithm>
#define fr(i,s,n) for(int i=s;i<n;i++)
#define fi freopen("in.txt","r",stdin)
#define cl(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
struct P{
int x,y;
}p[1010];
int s,n;
bool cmp(P a,P b){
if (a.x==b.x) return a.y>b.y;
else return a.x<b.x;
}
int main(){
scanf("%d%d",&s,&n);
fr(i,0,n){
scanf("%d%d",&p[i].x,&p[i].y);
}
sort(p,p+n,cmp);
bool flag=1;
fr(i,0,n){
if (s>p[i].x) s+=p[i].y;
else {
flag=0;
break;
}
}
if (flag) printf("YES\n");
else printf("NO\n");
return 0;
}
B:
#include<stdio.h>
#include<string.h>
#include <cmath>
#include<algorithm>
#define fr(i,s,n) for(int i=s;i<n;i++)
#define fi freopen("in.txt","r",stdin)
#define cl(a) memset(a,0,sizeof(a))
using namespace std;
typedef __int64 ll;
bool flag[1000010];
int prime[500000];
ll prime2[500000];
int t;
void init(){
t=0;
cl(flag);
int i,j;
int n=1000000;
for(i=2;i<=n;++i) { /*筛选素数快速的方法*/
if(!flag[i]) prime[t++]=i;
for(j=0;j<t&&i*prime[j]<=n;++j)
{
flag[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
fr(i,0,t){
prime2[i]=ll(prime[i])*ll(prime[i]);
}
}
ll tmp;
bool solve(){
int l=0,h=t-1,m;
while(l<=h){
m=(l+h)>>1;
if (prime2[m]==tmp){
return 1;
}
else if (prime2[m]>tmp) h=m-1;
else l=m+1;
}
if (prime2[l]==tmp) return 1;
return 0;
}
int main(){
init();
int T;
scanf("%d",&T);
fr(i,0,T){
scanf("%I64d",&tmp);
if (solve()) printf("YES\n");
else printf("NO\n");
}
return 0;
}
C:
#include<stdio.h>
#include<string.h>
#include <cmath>
#include<algorithm>
#define fr(i,s,n) for(int i=s;i<n;i++)
#define fi freopen("in.txt","r",stdin)
#define cl(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
int n,m;
char mp[20010];
int ans[110][20010];
int rans[110][20010];
int row;
int tmp;
int m2;
int dfs(int pos){
if (pos==m2) return pos;
if (mp[pos]=='1'){
tmp=dfs(pos+1);
ans[row][pos]=0;
return pos;
}
else{
tmp=dfs(pos+1);
ans[row][pos]=tmp-pos;
return tmp;
}
}
int rdfs(int pos){
if (pos==-1) return -1;
if (mp[pos]=='1'){
tmp=rdfs(pos-1);
rans[row][pos]=0;
return pos;
}
else{
tmp=rdfs(pos-1);
rans[row][pos]=pos-tmp;
return tmp;
}
}
void solve(){
int best=1000000000;
int tmp=1000000000;
fr(i,0,m){
tmp=0;
fr(j,0,n) tmp+=min(ans[j][i],rans[j][i+m]);
if (tmp<best) best=tmp;
}
if (best==1000000000) printf("-1\n");
else printf("%d\n",best);
}
int main(){
scanf("%d%d",&n,&m);
m2=2*m;
getchar();
bool havans=1;
fr(i,0,n){
gets(mp);
bool flag=0;
fr(k,0,m){
mp[m+k]=mp[k];
if (mp[k]=='1') flag=1;
}
if (!havans) continue;
if (!flag){
havans=0;
continue;
}
row=i;
dfs(0);
rdfs(m2-1);
}
if (havans)solve();
else printf("-1\n");
return 0;
}
#include<stdio.h>
#include<string.h>
#include <vector>
#include <cmath>
#include<algorithm>
#include <queue>
#define fr(i,s,n) for(int i=s;i<n;i++)
#define fi freopen("in.txt","r",stdin)
#define cl(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long ll;
const int N=100010;
struct E{
int u,v,nxt,w;
}edge[210010];
int n,m;
int k[N];
int tote,head[N];
void init(){
tote=0;
memset(head,-1,sizeof(head));
}
inline void addedge(int u,int v,int w){
edge[tote].u=u;edge[tote].v=v;edge[tote].w=w;edge[tote].nxt=head[u];head[u]=tote++;
};
int dis[250020];
int inq[250020];
queue<int> q;
struct Ti{ //time can't pass
int num;
int cnt;
Ti(){}
Ti(int x,int y){
num=x,cnt=y;
}
};
vector<Ti> ve[N];
int cal_dis(int now,int tmp){
int l=0,h=k[now]-1,m;
while(l<=h){
m=(l+h)>>1;
if (tmp==ve[now][m].num) {
return tmp+ve[now][m].cnt;
}
else if (tmp>ve[now][m].num) l=m+1;
else h=m-1;
}
return tmp;
}
struct CMP{
bool operator ()(const int a,const int b){
return dis[a]>dis[b];
}
};
priority_queue<int,vector<int>,CMP> pq;
bool done[N];
void dij(){ //和spfa 任选一个就行了,因为spfa极限情况下复杂度很高,所以没有拍,后来测了一下速度几乎和dij差不多。
int cur,v,tmp;
fr(i,0,n+1) dis[i]=1010000000;
dis[0]=0;
pq.push(0);
while(!pq.empty()){
cur=pq.top();
pq.pop();
if (done[cur]) continue;
done[cur]=1;
for (int i = head[cur]; i != -1; i=edge[i].nxt){
v=edge[i].v;
if (v==n){
dis[v]=min(dis[v],dis[cur]+edge[i].w);
continue;
}
tmp=cal_dis(v,dis[cur]+edge[i].w);
if (dis[v]>tmp){
dis[v]=tmp;
pq.push(v);
}
}
}
};
void spfa(){
int cur,v,tmp;
fr(i,0,n+1) dis[i]=1010000000;
q.push(0);
dis[0]=0;
while(!q.empty()){
cur = q.front();
q.pop();
inq[cur]=0;
for (int i = head[cur]; i != -1; i=edge[i].nxt){
v=edge[i].v;
if (v==n){
dis[v]=min(dis[v],dis[cur]+edge[i].w);
continue;
}
else tmp=cal_dis(v,dis[cur]+edge[i].w);
if (tmp<dis[v]) {
dis[v]=tmp;
if (!inq[v]){
q.push(v);
inq[v]=1;
}
}
}
}
}
int knum[N];
Ti ti[N];
int main(){
init();
scanf("%d%d",&n,&m);
int u,v,w;
fr(i,0,m){
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
addedge(0,1,0);
int tmp;
int tot=0;
fr(i,1,n+1){
tot=0;
scanf("%d",&k[i]);
fr(j,0,k[i]){
scanf("%d",&tmp);
knum[tot++]=tmp;
}
int aft=0,aftcnt=0;
for(int j=k[i]-1;j>=0;j--){
if (knum[j]+1==aft) aftcnt++;
else aftcnt=1;
aft=knum[j];
ti[--tot]=Ti(aft,aftcnt);
}
fr(j,0,k[i]){
ve[i].push_back(ti[j]);
}
}
spfa();
//dij();
if (dis[n]!=1010000000){
printf("%d\n",dis[n]);
}
else printf("-1\n");
return 0;
}
E:
#include<stdio.h>
#include<string.h>
#include <cmath>
#include<algorithm>
#define fr(i,s,n) for(int i=s;i<n;i++)
#define fi freopen("in.txt","r",stdin)
#define cl(a) memset(a,0,sizeof(a))
using namespace std;
typedef __int64 ll;
ll deg[1000010];
int main(){
ll n;
int m,u,v;
scanf("%I64d%d",&n,&m);
ll tot=n*(n-1)*(n-2)/6,dec=0;
fr(i,0,m){
scanf("%d%d",&u,&v);
deg[u]++;deg[v]++;
}
fr(i,1,n+1) dec+=deg[i]*(n-1-deg[i]);
printf("%I64d\n",tot-dec/2);
return 0;
}