快速排序(不知道有什么用)
void qsort(int l,int r) {
int i=l,j=r,mid=a[(l+r)>>1];
do {
while(a[i]mid) j--;
if(i<=j) {
swap(a[i],a[j]);
i++;j--;
}
}while(i<=j);
if(j>l) qsort(l,j);
if(i
ST表
//Serene
#include
#include
#include
#include
#include
#include
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]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
树状数组
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
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;i9)
{
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<
高精减法
#include
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;i1) l--;
for(int i=l-1;i>=0;i--) cout<
某神犇的高精模板
#include
#include
#include
#include
#include
#include
#include
#include
#include
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; //高进制位数
vectors;
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; ib.s.size())return false;
for(int i=s.size()-1; i>=0; i--)
{
if(s[i]b.s[i])return false;
}
return false;
}
bool operator >= (const BigInteger& b)
{
return !(*this=s.size()&&i>=b.s.size())break;
int x=g;
if(i=b.s.size())tmp=0;
else tmp=b.s[i];
if(c.s[i]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; i1)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<=0; i--)
{
char buf[20];
sprintf(buf,"%08d",x.s[i]);
for(int j=0; j=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
缩点
//Serene
#include
#include
#include
#include
#include
#include
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
#include
#include
#include
#include
#include
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;
}