快速排序(不知道有什么用)
void qsort(int l,int r) {
int i=l,j=r,mid=a[(l+r)>>1];
do {
while(a[i]<mid) i++;
while(a[j]>mid) j--;
if(i<=j) {
swap(a[i],a[j]);
i++;j--;
}
}while(i<=j);
if(j>l) qsort(l,j);
if(i<r) qsort(i,r);
}
ST表
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=2e5+10;
int n,m,st[maxn][19],mi[20];
int aa;char cc;
int read() {
aa=0;cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa;
}
int main() {
n=read();m=read();
int x,y,z,sz;mi[0]=1;
for(int i=1;i<=19&&mi[i-1]<n;++i) mi[i]=mi[i-1]*2,sz=i;
for(int i=1;i<=n;++i) st[i][0]=read();
for(int i=1;i<=19&&mi[i];++i) for(int j=1;j<=n;++j) if(j+mi[i]-1<=n) {
st[j][i]=max(st[j][i-1],st[j+mi[i-1]][i-1]);
}
for(int i=1;i<=m;++i) {
x=read();y=read();
z=sz;while(mi[z]>y-x+1) z--;
printf("%d\n",max(st[x][z],st[y-mi[z]+1][z]));
}
return 0;
}
线性筛素数
int prime[maxn/10],tot_p;
bool vis[maxn];
void get_p() {
vis[1]=1;
for(int i=2;i<=n;++i) {
if(!vis[i]) prime[++tot_p]=i;
for(int j=1;j<=tot_p&&prime[j]<=n/i;++j) {
vis[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}
最小生成树
struct Edge{
int x,y,z;
}edge[maxm];
bool cmp(const Edge& a,const Edge& b) {
return a.z<b.z;
}
int fa[maxn];
int find(int x) {
return x==fa[x]? x:fa[x]=find(fa[x]);
}
void Kr() {
for(int i=1;i<=n;++i) fa[i]=i;
sort(edge+1,edge+m+1,cmp);
int tot=0,xx,yy,ans=0;
for(int i=1;i<=m&&tot<n-1;++i) {
xx=find(edge[i].x);yy=find(edge[i].y);
if(xx!=yy) {
fa[xx]=yy; tot++; ans+=edge[i].z;
}
}
if(tot==n-1) printf("%d",ans);
else printf("orz");
}
树状数组
int lb(int x) {
return x&(-x);
}
void add(int pos,int x) {
while(pos<=n) {
sz[pos]+=x;
pos+=lb(pos);
}
}
int rs;
int q(int pos) {
rs=0;
while(pos) {
rs+=sz[pos];
pos-=lb(pos);
}
return rs;
}
高精加法
#include<bits/stdc++.h>
using namespace std;
int a[50000],b[50000],c[50000];
int main(){
string st1,st2;
cin>>st1>>st2;
int n1=st1.size();
int n2=st2.size();
for (int i=0;i<n1;i++)
a[i]=st1[st1.size()-i-1]-48;
for (int i=0;i<n2;i++)
b[i]=st2[st2.size()-i-1]-48;
int l=max(n1,n2);
for (int i=0;i<l;i++)
{
c[i]+=a[i]+b[i];
if (c[i]>9)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
}
while(c[l]!=0) l++;
while(c[l-1]==0&&l>1) l--;
for(int i=l-1;i>=0;i--) cout<<c[i];
return 0;
}
高精减法
#include<bits/stdc++.h>
using namespace std;
int a[50000],b[50000],c[50000];
bool ok=0;
int main(){
string st1,st2;
cin>>st1>>st2;
int n1=st1.size();
int n2=st2.size();
for (int i=0;i<n1;i++)
a[i]=st1[n1-i-1]-48;
for (int i=0;i<n2;i++)
b[i]=st2[n2-i-1]-48;
if(n1<n2) ok=1;
else if(n1==n2) {
for(int i=0;i<n1;++i) {
if(a[i]!=b[i]) {
ok=a[i]<b[i];
break;
}
}
}
if(ok==1) {
cout<<"-";
swap(a,b);swap(n1,n2);
}
int l=max(n1,n2);
for (int i=0;i<l;i++)
{
c[i]+=a[i]-b[i];
if (c[i]<0)
{
c[i+1]--;
c[i]+=10;
}
}
while(c[l]!=0) l++;
while(c[l-1]==0&&l>1) l--;
for(int i=l-1;i>=0;i--) cout<<c[i];
return 0;
}
某神犇的高精模板
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<ctime>
using namespace std;
inline const int Get_Int()
{
int num=0,bj=1;
char x=getchar();
while(x<'0'||x>'9')
{
if(x=='-')bj=-1;
x=getchar();
}
while(x>='0'&&x<='9')
{
num=num*10+x-'0';
x=getchar();
}
return num*bj;
}
struct BigInteger
{
static const int BASE=100000000; //高进制
static const int WIDTH=8; //高进制位数
vector<long long>s;
BigInteger() //构造函数:初始赋0
{
*this=0;
}
BigInteger(const int& num) // 构造函数
{
*this=num;
}
//赋值
BigInteger operator = (int num)
{
s.clear();
do
{
s.push_back(num%BASE);
num/=BASE;
}while(num>0);
return *this;
}
BigInteger operator = (const string& str)
{
s.clear();
int x,len=(str.length()-1)/WIDTH+1;
for(int i=0; i<len; i++)
{
int end=str.length()-i*WIDTH;
int start=max(0,end-WIDTH);
sscanf(str.substr(start,end-start).c_str(),"%lld",&x);
s.push_back(x);
}
return *this;
}
//比较
bool operator < (const BigInteger& b)
{
if(s.size()<b.s.size())return true;
if(s.size()>b.s.size())return false;
for(int i=s.size()-1; i>=0; i--)
{
if(s[i]<b.s[i])return true;
if(s[i]>b.s[i])return false;
}
return false;
}
bool operator >= (const BigInteger& b)
{
return !(*this<b);
}
bool operator == (const BigInteger& b)
{
if(s.size()!=b.s.size())return false;
for(int i=0; i<s.size(); i++)
if(s[i]!=b.s[i])return false;
return true;
}
//+
BigInteger operator + (const BigInteger& b)
{
BigInteger c;
c.s.clear();
for(int i=0,g=0; ; i++)
{
if(g==0&&i>=s.size()&&i>=b.s.size())break;
int x=g;
if(i<s.size())x+=s[i];
if(i<b.s.size())x+=b.s[i];
c.s.push_back(x%BASE);
g=x/BASE;
}
return c;
}
//-
BigInteger operator - (const BigInteger& b)
{
BigInteger c;
c=*this;
for(int i=0; i<c.s.size(); i++)
{
int tmp;
if(i>=b.s.size())tmp=0;
else tmp=b.s[i];
if(c.s[i]<tmp)
{
c.s[i+1]-=1;
c.s[i]+=BASE;
}
c.s[i]-=tmp;
}
while(c.s.back()==0&&c.s.size()>1)c.s.pop_back();
return c;
}
void operator -= (const BigInteger& b)
{
*this=*this-b;
}
//*
BigInteger operator * (const BigInteger& b)
{
BigInteger c;
c.s.resize(s.size()+b.s.size());
for(int i=0; i<s.size(); i++)
for(int j=0; j<b.s.size(); j++)c.s[i+j]+=s[i]*b.s[j];
for(int i=0; i<c.s.size()-1; i++)
{
c.s[i+1]+=c.s[i]/BASE;
c.s[i]%=BASE;
}
while(c.s.back()==0&&c.s.size()>1)c.s.pop_back();
return c;
}
friend istream& operator >> (istream& input,BigInteger& x)
{
string s;
if(!(input>>s))return input;
x=s;
return input;
}
friend ostream& operator << (ostream& output,const BigInteger& x)
{
output<<x.s.back();
for(int i=x.s.size()-2; i>=0; i--)
{
char buf[20];
sprintf(buf,"%08d",x.s[i]);
for(int j=0; j<strlen(buf); j++)output<<buf[j];
}
return output;
}
};
// /
BigInteger Copy(const BigInteger& b,int x)
{
BigInteger t;
t.s.resize(b.s.size()+x);
for(int i=0; i<b.s.size(); i++)t.s[i+x]=b.s[i];
return t;
}
BigInteger Divide(const BigInteger& a,const BigInteger& b,BigInteger& mod)
{
BigInteger c;
c.s.resize(a.s.size()-b.s.size()+1);
mod=a;
int Pow[(int)log2(BigInteger::BASE)+5];
Pow[0]=1;
for(int i=1; i<=log2(BigInteger::BASE); i++)Pow[i]=Pow[i-1]*2;
for(int i=c.s.size()-1; i>=0; i--)
{
BigInteger t;
t=Copy(b,i);
for(int j=log2(BigInteger::BASE); j>=0; j--)
if(mod>=t*Pow[j])
{
c.s[i]+=Pow[j];
mod-=t*Pow[j];
}
}
while(c.s.back()==0&&c.s.size()>1)
c.s.pop_back();
return c;
}
BigInteger a,b;
int main()
{
cin>>a>>b;
if(a<b)
cout<<a+b<<endl<<'-'<<b-a<<endl<<a*b<<endl<<0<<endl<<a<<endl;
else
{
BigInteger c,d;
c=Divide(a,b,d);
cout<<a+b<<endl<<a-b<<endl<<a*b<<endl<<c<<endl<<d<<endl;
}
return 0;
}
缩点
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1e4+10,maxm=1e5+10;
int n,m,v[maxn],ans;
int aa;char cc;
int read() {
aa=0;cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa;
}
int fir[maxn],nxt[maxm],to[maxm],e=0;
void add(int x,int y) {
to[++e]=y;nxt[e]=fir[x];fir[x]=e;
}
bool vis[maxn],inz[maxn];
int id[maxn],top[maxn],zz[maxn],d=0,t=0;
int xd[maxn],sum[maxn],tot_x;
void tj(int pos) {
vis[pos]=1;zz[++t]=pos;inz[pos]=1;
top[pos]=id[pos]=++d;
for(int y=fir[pos];y;y=nxt[y]) {
if(vis[to[y]]&&inz[to[y]]) top[pos]=min(top[pos],top[to[y]]);
if(vis[to[y]]) continue;
tj(to[y]);
top[pos]=min(top[pos],top[to[y]]);
}
if(top[pos]==id[pos]) {
sum[++tot_x]=0;
while(t){
xd[zz[t]]=tot_x;
sum[tot_x]+=v[zz[t]];
inz[zz[t--]]=0;
if(zz[t+1]==pos) break;
}
}
}
int rd[maxn];
int ff[maxn],nn[maxm],tt[maxm],ee=0;
void add2(int x,int y) {
tt[++ee]=y;nn[ee]=ff[x];ff[x]=ee;
rd[y]++;
}
int ga(int pos) {
int rs=0;
for(int y=ff[pos];y;y=nn[y]) rs=max(rs,ga(tt[y]));
return rs+sum[pos];
}
int main() {
n=read();m=read(); int x,y;
for(int i=1;i<=n;++i) v[i]=read();
for(int i=1;i<=m;++i) {
x=read();y=read();
add(x,y);
}
for(int i=1;i<=n;++i) if(!vis[i]) tj(i);
for(int i=1;i<=n;++i) {
for(int j=fir[i];j;j=nxt[j]) {
if(xd[to[j]]^xd[i]) add2(xd[i],xd[to[j]]);
}
}
for(int i=1;i<=tot_x;++i) if(!rd[i]) ans=max(ans,ga(i));
printf("%d",ans);
return 0;
}
割点
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=100000+10;
int n,m,ans;
int aa;char cc;
int read() {
aa=0;cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa;
}
int fir[maxn],nxt[2*maxn],to[2*maxn],e=0;
void add(int x,int y) {
to[++e]=y;nxt[e]=fir[x];fir[x]=e;
to[++e]=x;nxt[e]=fir[y];fir[y]=e;
}
int id[maxn],top[maxn],d=0;
bool cut[maxn],vis[maxn];
void tj(int pos,int fa) {
id[pos]=top[pos]=++d;vis[pos]=1;
int tot=0;
for(int y=fir[pos];y;y=nxt[y]) {
if(vis[to[y]]) {
if(to[y]!=fa)top[pos]=min(top[pos],id[to[y]]);//
continue;
}
tj(to[y],pos);tot++;
if(id[pos]!=1&&top[to[y]]>=id[pos]) cut[pos]=1;
top[pos]=min(top[pos],top[to[y]]);
}
if(id[pos]==1&&tot>1) cut[pos]=1;//
if(cut[pos]) ans++;
}
int main() {
n=read(); m=read(); int x,y;
for(int i=1;i<=m;++i) {
x=read();y=read();
add(x,y);
}
for(int i=1;i<=n;++i) if(!vis[i]) {
d=0;tj(i,0);
}
printf("%d\n",ans);
for(int i=1;i<=n;++i) if(cut[i]) printf("%d ",i);
return 0;
}