代码整理---之江杯

基本算法

洛谷题库

枚举 P2241 统计方形(数据加强版)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long n,m,i,j,sum=0,sum1=0;
	cin>>n>>m;
	for(i=1;i<=n;i++)
	{
	  for(j=1;j<=m;j++)
	  {
	    sum+=min(i,j);
	    sum1+=i*j;
	  }
	}
	
	cout<<sum<<" "<<sum1-sum<<endl;
	return 0;
}

贪心 P1803 凌乱的yyy / 线段覆盖

#include<bits/stdc++.h>
using namespace std;
int ans=0;
struct qj
{
    long int l;
    long int r;
}asd[1000010];
bool vis[1000010]={0};
bool comp(qj a,qj b)
{
    if(a.r>b.r) return 0;
    else return 1;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>asd[i].l>>asd[i].r;
    sort(asd+1,asd+1+n,comp);
    for(int i=1;i<=n;i++)
    {
        if(!vis[i])
        {
            ans++;
            vis[i]=1;
            for(int j=i+1;j<=n;j++)
            {
                if(asd[i].r>asd[j].l) 
                {
                    vis[j]=1;/
                }
            }
        }
    }
    cout<<ans;
    return 0;
}

模拟 P1042 [NOIP2003 普及组] 乒乓球

#include <bits/stdc++.h>
using namespace std;
int main(){
	char s;
	string a;
	long long w,l,i;
    while(cin>>s && s != 'E')
    {
        if(s == 'W') {w++;a+=s;}
        if(s == 'L') {l++;a+=s;}
        if((w >= 11 || l >= 11) && (w - l >=2 || l - w >= 2))
        { 
            cout<<w<<":"<<l<<endl;
            w=0;
            l=0;
        }
        i++;
    }
        cout<<w<<":"<<l<<endl<<endl;
    w=0;l=0;
        for(int j;j<=i;j++)
        {
        if(a[j] == 'W') w++;
        if(a[j] == 'L') l++;
        if((w >= 21 || l >= 21) && (w - l >=2 || l - w >= 2))
        {
            cout<<w<<":"<<l<<endl;
            w=0;
            l=0;
        }
    }
    cout<<w<<":"<<l;
}

二分 P1873 [COCI 2011/2012 #5] EKO / 砍树

#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int n, m;
bool check(int k)
{
    long long sum = 0;
    for (int i = 1; i <= n; i++)
        if (a[i] > k)
            sum += (long long)(a[i] - k);
    return sum >= m;
}

int find() {
    int l = 1, r = 1000000001;
    while (l + 1 < r)
    {
        int mid = (l + r) / 2;
        if (check(mid))
            l = mid;
        else
            r = mid;
    }
    return l;
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    cout << find();
    return 0;
}

递归和分治 P1028 [NOIP2001 普及组] 数的计算

#include<bits/stdc++.h>
using namespace std;
int a[1001];
int main() 
{
	int n;cin>>n;
 for(int i=1;i<=1001;i++)
	{ 
        for(int j=1;j<=i/2;j++) a[i]+=a[j]; 
        a[i]++; 
    }
	cout<<a[n]<<endl;
}

前缀和与差分 P3397 地毯

#include<bits/stdc++.h>
using namespace std;
int a[1010][1010];
int main() 
{
	int n,m;cin>>n>>m;
	while(m--)
	{
		int x1,y1,x2,y2;
		cin>>x1>>y1>>x2>>y2;
		for(int i=x1;i<=x2;i++)
		{
			a[i][y1]++;
			a[i][y2+1]--;
		}
	}
	for(int i=1;i<=n;i++)
	{
		cout<<a[i][1];
		for(int j=2;j<=n;j++)
		{
			a[i][j]+=a[i][j-1];
			cout<<" "<<a[i][j];
		}	
		if(i<n) cout<<endl;
	}
}

字符串

字符串哈希 P3370 【模板】字符串哈希

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const int o=1524,oo=10024;
int n,ans;
int len[o],lk[o][oo];
char s[oo][o];
ull base=131,h[oo];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",s[i]+1);
		int ln=strlen(s[i]+1);
		lk[ln][++len[ln]]=i;
		ull k=0;
		for(int j=1;j<=ln;j++)
			k=k*base+(ull)(s[i][j]-'0');
		h[i]=k;
		for(int j=1;j<len[ln];j++)
		{
			int pos=lk[ln][j];
			if(h[pos]==k)
			{
				ans++;
				break;
			}
		}
	}
	printf("%d\n",n-ans);
	return 0;
}

字典树 P2580 于是他错误的点名开始了

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define memset(a,b) memset(a,b,sizeof(a))
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
const double pi = acos(-1.0);
const int MOD=1000000007;
const int INF=0x3f3f3f3f;
//10 61109567  21 22219134 0x3f
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int son[2000010][26],num[2000010],idx;
void insert(char *s)
{
	int p=0;
	for(int i=0;s[i];i++)
	{
		int u=s[i]-'a';
		if(!son[p][u]) son[p][u]=++idx;
		p=son[p][u];
	}
	num[p]++;
}
int find(char *s)
{
	int p=0;
	for(int i=0;s[i];i++)
	{
		int u=s[i]-'a';
		if(!son[p][u]) return false;
		p=son[p][u];
	}
	num[p]++;
	return num[p];
}
int main()
{
	ios;
	int n,m;cin>>n;
	char s[60];
	while(n--)
	{
		cin>>s;
		insert(s);
	}
	cin>>m;
	while(m--)
	{
		cin>>s;
		if(find(s)==2) cout<<"OK";
		else if(find(s)>2) cout<<"REPEAT";
		else cout<<"WRONG";
		cout<<endl;
	}
}

Manacher算法 P3805 【模板】manacher 算法

#include<bits/stdc++.h>
#define N 31000010
using namespace std;
int n,p[N],ans;
char s[N],str[N];
void manachar(){
    int mx=0,id;
    for(int i=n;str[i]!=0;i++)str[i]=0;
    for(int i=1;i<n;i++){
        if(mx>i)p[i]=min(p[2*id-i],p[id]+id-i);
        else p[i]=1;
        for (;str[i+p[i]]==str[i-p[i]];++p[i]);
        if (p[i]+i>mx){mx=p[i]+i;id=i;}
    }
}
void init(){
    str[0]='#';str[1]='#';
    for(int i=0;i<n;i++)str[(i<<1)+2]=s[i],str[(i<<1)+3]='#';
    n=(n<<1)+2;str[n]=0;
}
int main(){
    scanf("%s",s);
    n=strlen(s);init();manachar();
    ans=0;
    for(int i=0;i<n;i++)ans=max(ans,p[i]);
    printf("%d\n",ans-1);
    
}

KMP P3375 【模板】KMP字符串匹配

#include<bits/stdc++.h>
#define MAXN 1000010
using namespace std;
int kmp[MAXN];
int la,lb,j; 
char a[MAXN],b[MAXN];
int main()
{
    cin>>a+1;
    cin>>b+1;
    la=strlen(a+1);
    lb=strlen(b+1);
    for (int i=2;i<=lb;i++)
	   {     
	   while(j&&b[i]!=b[j+1])
        j=kmp[j];    
       if(b[j+1]==b[i])j++;    
        kmp[i]=j;
       }
    j=0;
    for(int i=1;i<=la;i++)
	   {
          while(j>0&&b[j+1]!=a[i])
           j=kmp[j];
          if (b[j+1]==a[i]) 
           j++;
          if (j==lb) {cout<<i-lb+1<<endl;j=kmp[j];}
       }

    for (int i=1;i<=lb;i++)
    cout<<kmp[i]<<" ";
    return 0;
}

数据结构

链表 P3613 【深基15.例2】寄包柜

#include<bits/stdc++.h>
using namespace std;
int n,q,p,k;
map<long long,int>b;
long long i,j;
int main()
{
	scanf("%d%d",&n,&q);
	while(q--)
	{
		scanf("%d%d%d",&p,&i,&j);
		if(p==1)
		{
			scanf("%d",&k);
			b[i*1000000+j]=k;
		}
		else printf("%d\n",b[i*1000000+j]);
	}
	return 0;
}

栈 P1427 小鱼的数字游戏

#include<bits/stdc++.h>
using namespace std;
int a[101];
int top=0,c;
int main(){
	while(1){
		cin>>c;
		if(c==0) break;
		a[++top]=c;
	}
	while(top!=0){
		cout<<a[top--]<<" ";
	}
	return 0;
} 

队列 P1540 [NOIP2010 提高组] 机器翻译

#include<bits/stdc++.h>
#include<iostream>
#include<queue>
using namespace std;
queue<int> q;
int m,n,ans;
bool inq[1010];
int main()
{
	cin>>m>>n;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		if(inq[x])continue;
		else
		{
			if(q.size()>=m)
			{
				inq[q.front()]=false;
				q.pop();
			}
			q.push(x);
			inq[x]=true;
			ans++;
		}
	}
	cout<<ans;
	return 0;
}

并查集 P1551 亲戚

#include<bits/stdc++.h>
using namespace std;
int s[10009];
 int find(int x)
 {
 	int r=x;
 	while(s[r]!=r)
 		r=s[r];
 	return r;
 }
int main()
{
    std::ios::sync_with_stdio(false);
	int n,m,k;
	cin>>n>>m>>k;
	 for(int i=1;i<=n;i++)
        s[i]=i;
     while(m--)
	{
		int x,y;cin>>x>>y;
		s[find(x)]=find(y);
	}
	 while(k--)
	{
		int x,y;cin>>x>>y;
		if(find(x)==find(y))
			{
				puts("Yes");
			}
			else
			{
				puts("No");
			}
	}
} 

树状数组 P3374 【模板】树状数组 1

#include<bits/stdc++.h>
using namespace std;
int n,m,tree[2000010];
int lowbit(int k)
    {
        return k & -k;
    }
void add(int x,int k)
    {
        while(x<=n)
        {
            tree[x]+=k;
            x+=lowbit(x);
        }
    }
int sum(int x)
    {
        int ans=0;
        while(x!=0)
        {
            ans+=tree[x];
            x-=lowbit(x);
        }
        return ans;
    }
int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            int a;
            scanf("%d",&a);
            add(i,a);
        }
        for(int i=1;i<=m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            if(a==1)
                add(b,c);
            if(a==2)
                cout<<sum(c)-sum(b-1)<<endl;
        }
    }

线段树 P3372 【模板】线段树 1

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;

int a[maxn+2];

struct tree{
    int l,r;
    long long pre,add;
}t[4*maxn+2];

void bulid(int p,int l,int r){
    t[p].l=l;t[p].r=r;
    if(l==r){
        t[p].pre=a[l];
        return;
    }
    int mid=l+r>>1;
    bulid(p*2,l,mid);
    bulid(p*2+1,mid+1,r);
    t[p].pre=t[p*2].pre+t[p*2+1].pre;
} 

void spread(int p){
    if(t[p].add){
        t[p*2].pre+=t[p].add*(t[p*2].r-t[p*2].l+1);
        t[p*2+1].pre+=t[p].add*(t[p*2+1].r-t[p*2+1].l+1);
        t[p*2].add+=t[p].add;
        t[p*2+1].add+=t[p].add;
        t[p].add=0;
    }
}

void change(int p,int x,int y,int z){
    if(x<=t[p].l && y>=t[p].r){
        t[p].pre+=(long long)z*(t[p].r-t[p].l+1);
        t[p].add+=z;
        return;
    }
    spread(p);
    int mid=t[p].l+t[p].r>>1;
    if(x<=mid) change(p*2,x,y,z);
    if(y>mid) change(p*2+1,x,y,z);
    t[p].pre=t[p*2].pre+t[p*2+1].pre;   
}

long long ask(int p,int x,int y){
    if(x<=t[p].l && y>=t[p].r) return t[p].pre;
    spread(p);
    int mid=t[p].l+t[p].r>>1;
    long long ans=0;
    if(x<=mid) ans+=ask(p*2,x,y);
    if(y>mid) ans+=ask(p*2+1,x,y);
    return ans;
}

int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
    bulid(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int q,x,y,z;
        scanf("%d",&q);
        if(q==1){
            scanf("%d%d%d",&x,&y,&z);
            change(1,x,y,z);
        }
        else {
            scanf("%d%d",&x,&y);
            cout<<ask(1,x,y)<<endl;
        }
    }
    return 0;
}

图的存储

邻接矩阵 P5318 【深基18.例3】查找文献

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
	{
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
	{
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
int n,m;
bool b[100005];
vector<int > a[100005]; 
void dfs(int x,int r)
{
	b[x]=true;
	if(!r) 
	{
		cout<<x<<' ';
		return ;
	}
	cout<<x<<' ';
	for(int i=0;i<a[x].size();i++)
	if(!b[a[x][i]]) dfs(a[x][i],r-1);
}
void bfs()
{
	queue<int> q;
	q.push(1);b[1]=true;
	while(!q.empty())
	{
		int s=q.front(); q.pop();
		cout<<s<<' ';
		for(int i=0;i<a[s].size();i++) if(b[a[s][i]]==false) 		 q.push(a[s][i]),b[a[s][i]]=true;
	}
}
int main()
{
	n=read();
	m=read();
	for(int i=1;i<=m;i++) 
	{
		int x,y;
		x=read();
		y=read();
		a[x].push_back(y);
	}
	for(int i=1;i<=n;i++)
	sort(a[i].begin(),a[i].end());
	dfs(1,n);
	cout<<endl;
	for(int i=1;i<=n;i++) b[i]=false; 
	bfs();
	return 0;
}

邻接表 P1073 [NOIP2009 提高组] 最优贸易

#include<bits/stdc++.h>
#define INF 0x7f7f7f7f
#define MAXN 100005
using namespace std;

vector<int> g[MAXN];
int n,m,f[MAXN],mi[MAXN],c[MAXN];

void dfs(int x,int minx,int pre) {
    int flag=1; 
    minx=min(c[x],minx);
    if (mi[x]>minx) mi[x]=minx,flag=0;
    int maxx=max(f[pre],c[x]-minx);
    if (f[x]<maxx) f[x]=maxx,flag=0;
    if (flag) return;
    for (int i=0;i<g[x].size();i++) dfs(g[x][i],minx,x);
}

int main() {
    scanf("%d%d",&n,&m);
    for (int i=0;i<MAXN;i++) mi[i]=INF;
    for (int i=1;i<=n;i++) scanf("%d",&c[i]);
    for (int i=1;i<=m;i++) {
        int t1,t2,t3;
        scanf("%d%d%d",&t1,&t2,&t3);
        g[t1].push_back(t2);
        if (t3==2) g[t2].push_back(t1);
    }
    dfs(1,INF,0);
    printf("%d\n",f[n]);
    return 0;
}

深度优先搜索 P4017 最大食物链计数

#include<bits/stdc++.h>
using namespace std;
const int N=6005,M=500005,mod=80112002;
#define ll long long
ll n,m,ft[N],nx[M],to[M],f[N],rd[N],ans;
bool st[N];
inline long long read()
{
    char c=getchar();long long sum=0,f=1;
    while(!(c>='0'&&c<='9')) {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') {sum=((sum<<1)+(sum<<3))+(c-'0');c=getchar();}
    return sum*f;
}
void dfs(ll x)
{
	if(!rd[x])
	{
	   if(!ft[x])
	   {
		   ans=(ans%mod+f[x]%mod)%mod;
		   return;
	   }
	   else for(ll i=ft[x];i;i=nx[i])
	   {
		   rd[to[i]]--;
		   f[to[i]]=(f[to[i]]%mod+f[x]%mod)%mod;
		   dfs(to[i]);
	   }
    }
	return;
}
int main()
{
	n=read();m=read();
	for(int i=1;i<=m;i++)
	{
		ll a=read(),b=read();
		rd[b]++;
		nx[i]=ft[a];
		ft[a]=i;
		to[i]=b;
	}
	for(int i=1;i<=n;i++) if(!rd[i]) st[i]=1;
	for(int i=1;i<=n;i++) if(st[i]) f[i]=1,dfs(i);
	cout<<ans%mod;
	return 0;
}

广度优先搜索 P6691 选择题

#include<bits/stdc++.h>
using namespace std;
void read(int &x){
	int f=1;x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') { x=x*10+ch-'0';ch=getchar();}
	x*=f;
}
#define N 1000010
#define Mod 998244353
int n,tot;//全局部分 
int v[N],d[N],flag;//判无解用 , d[i] 表示 i 点正误相对情况 
int ans1;//有多少个块
int ansmx,ansmn;//最多答案和最少答案 

int pow(int x,int y){//快速幂部分 
	int ans=1;
	for(;y;y>>=1){
		if(y&1) ans=((long long)ans*x)%Mod;
		x=((long long)x*x)%Mod;
	}
	return ans%Mod;
} 

int head[N],ne[N<<1],to[N<<1],sz[N<<1];//建森林部分 
void add(int x,int y,int opt){
	to[++tot]=y,ne[tot]=head[x],sz[tot]=!opt,head[x]=tot;
} 

int q[N<<1],hed,tail,now;//bfs 部分 
void bfs(int x){
	hed=tail=0;//队首和队尾 
	now=0;
	q[++tail]=x;
	while(hed<tail){
		hed++;
		x=q[hed];//取出队首 
		v[x]=1;//已经访问过 
		for(int i=head[x];i;i=ne[i]){
			int y=to[i];
			if(v[y]){//如果已经访问过且出现矛盾,判无解 
				if(d[x]^sz[i]!=d[y]){//我用 sz[] 记录边权 
					flag=1;return ;
				}
				continue;
			}
			d[y]=d[x]^sz[i];//每访问过,更新真假性 
			q[++tail]=y;//入队 
			v[y]=1;//已经访问过 
			now+=d[y];//暂时先别管 
		}
	}
}

int main(){
	read(n);
	for(int i=1;i<=n;i++){
		int x,opt;
		read(x),read(opt);
		add(i,x,opt),add(x,i,opt);
	}
	for(int i=1;i<=n;i++){
		if(!v[i]){
			bfs(i);
			ans1++;
			if(flag){
				printf("No answer");
				return 0;
			}
			ansmx+=max(tail-now,now);
			ansmn+=min(tail-now,now);
		}
	}
	printf("%d\n%d\n%d",pow(2,ans1),ansmx,ansmn);
}

最短路算法

Dijkstra算法 P3371 【模板】单源最短路径(弱化版)

#include<bits/stdc++.h>
const long long inf=2147483647;
const int maxn=10005;
const int maxm=500005;
using namespace std;
int n,m,s,num_edge=0;
int dis[maxn],vis[maxn],head[maxm];
struct Edge
{
  int next,to,dis;
}edge[maxm]; //结构体表示静态邻接表
void addedge(int from,int to,int dis) //邻接表建图
{ //以下是数据结构书上的标准代码,不懂翻书看解释
  edge[++num_edge].next=head[from]; //链式存储下一条出边
  edge[num_edge].to=to; //当前节点编号
  edge[num_edge].dis=dis; //本条边的距离
  head[from]=num_edge; //记录下一次的出边情况
}
void spfa()
{
  queue<int> q; //spfa用队列,这里用了STL的标准队列
  for(int i=1; i<=n; i++) 
  {
    dis[i]=inf; //带权图初始化
    vis[i]=0; //记录点i是否在队列中,同dijkstra算法中的visited数组
  }
  q.push(s); dis[s]=0; vis[s]=1; //第一个顶点入队,进行标记
  while(!q.empty())
  {
    int u=q.front(); //取出队首
    q.pop(); vis[u]=0; //出队标记
    for(int i=head[u]; i; i=edge[i].next) //邻接表遍历,不多解释了(也可用vector代替)
    {
      int v=edge[i].to; 
      if(dis[v]>dis[u]+edge[i].dis) //如果有最短路就更改
      {
        dis[v]=dis[u]+edge[i].dis;
        if(vis[v]==0) //未入队则入队
        {
          vis[v]=1; //标记入队
          q.push(v);
        }
      }
    }
  }
}
int main()
{
  cin>>n>>m>>s;
  for(int i=1; i<=m; i++)
  {
    int f,g,w;
    cin>>f>>g>>w; 
    addedge(f,g,w); //建图,有向图连一次边就可以了
  }
  spfa(); //开始跑spfa
  for(int i=1; i<=n; i++)
    if(s==i) cout<<0<<" "; //如果是回到自己,直接输出0
      else cout<<dis[i]<<" "; //否则打印最短距离
  return 0;
}

Floyd算法 P6175 无向图的最小环问题

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf = 1e13;
int n,m,u,v,w,ans = inf;
int dis[128][128];
int mp[128][128];
signed main(void){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(i!=j)dis[i][j]=mp[i][j]=inf;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>w;
		dis[u][v]=min(dis[u][v],w);
		dis[v][u]=min(dis[v][u],w);
		mp[u][v]=min(mp[u][v],w);
		mp[v][u]=min(mp[v][u],w);
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<k;i++)
			for(int j=i+1;j<k;j++)
				ans = min(ans,dis[i][j]+mp[i][k]+mp[k][j]);
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++){
				dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
				dis[j][i] = dis[i][j];
			}
		
	}
	if(ans==inf)cout<<"No solution.";
	else cout<<ans;
	return 0;
}

动态规划

线性dp P1439 【模板】最长公共子序列

#include<bits/stdc++.h>
using namespace std;
int len=0;
int a[100001],p[100001],f[100001];
int bound(int x)
{
	int L=1,R=len;
	while(L<R)
	{
		int mid=(L+R)>>1;
		if(p[f[mid]]>p[x])
			R=mid;
		else
			L=mid+1;
	}
	return L;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		p[x]=i;
	}
	for(int i=1;i<=n;i++)
	{
		if(p[a[i]]>p[f[len]])
			f[++len]=a[i];
		else
			f[bound(a[i])]=a[i];
	}
	cout<<len<<endl;
	return 0;
}

背包问题 P1060 [NOIP2006 普及组] 开心的金明

#include<bits/stdc++.h>
using namespace std;
int w[30],v[30],f[50000];
int n,m;
int main()
{
    cin>>m>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i]>>w[i];
        w[i]*=v[i];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=m;j>=v[i];j--)
        {
            if(j>=v[i])
            {
                f[j]=max(f[j],f[j-v[i]]+w[i]);
            }
        }
    }
    cout<<f[m]<<endl;
    return 0;
} 

数学

位运算 P1100 高低位交换

#include<bits/stdc++.h>
using namespace std;
int main()
{
    unsigned long long x;
    cin>>x;
    cout<<((x&0x0000ffff)<<16|(x&0xffff0000)>>16)<<endl;
}

快速幂 P1226 【模板】快速幂||取余运算

#include<bits/stdc++.h>
using namespace std;
int main(){
	int b,d;
	long long ans,a,k,c;
	scanf("%lld%d%lld",&a,&b,&k);
	c=a;
	d=b;
	ans=1%k;
	while(b){
		if(b%2){
			ans=(ans*a)%k;
		}
		a=(a*a)%k;
		b/=2;
	}
	printf("%lld^%d mod %lld=%lld",c,d,k,ans);
	return 0;
}

欧几里得算法 P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,m,sum=0;cin>>m>>n;
	if(n==m) sum--;
	n*=m;
	for(int i=1;i<=sqrt(n);i++)
		if(n%i==0&&__gcd(i,n/i)==m) sum+=2;
	cout<<sum<<endl; 
	return 0;
 } 

素数筛 P5736 【深基7.例2】质数筛

#include<bits/stdc++.h>
bool isPrime[100000010];
int Prime[6000010], cnt = 0;
void GetPrime(int n)
{
	memset(isPrime, 1, sizeof(isPrime));
	isPrime[1] = 0;
	for(int i = 2; i <= n; i++)
	{
		if(isPrime[i])
			Prime[++cnt] = i; 		
		for(int j = 1; j <= cnt && i*Prime[j] <= n; j++) 
		{
			isPrime[i*Prime[j]] = 0;
            
			if(i % Prime[j] == 0)
				break; 
		}
	}
}
int main()
{
	int n, q;
	scanf("%d %d", &n, &q);
	GetPrime(n);
	while (q--)
	{
		int k;
		scanf("%d", &k);
		printf("%d\n", Prime[k]);
	}
	return 0;
}

简单博弈 P2197 【模板】nim 游戏

#include<bits/stdc++.h>
using namespace std;
int main() 
{
	int t;cin>>t;
	while(t--)
	{
		int n;cin>>n;int temp=0;
		for(int i=0;i<n;i++)
		{
			int  a;
			cin>>a;
			temp=temp^a;
		}
		if(!temp) cout<<"No"<<endl;
		else cout<<"Yes"<<endl;
	 } 
	 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值