day 2 数学基础+数据结构
好吧,实际上好多我也不会
质数
bool is_prime(int n)
{
if(n<2) return flase;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0) return flase;
return true;
}
质数筛
基本上用欧式晒
void prime(int n)
{
memset(v,0,sizeof(v));
for(int i=2;i<=n;i++)
{
if(v[i]) continue;
cout<<i<<endl;
for(int j=2;j<=n/i;j++) v[i*j]=1;
}
}
剩下的估计初赛也不考
数据结构
并查集
int find(int x)
{
if(x==fa[x])return fa[x];
return fa[x]=get(fa[x]);
}
void merge(int x,int y)
{
fa[get(x)]=get(y);
}
另外还有扩展与,边带全
在我博客,不再重复
树状数组
#include<bits/stdc++.h>
using namespace std;
inline long long read(){
long long num=0;int z=1;char c=getchar();
if(c=='-') z=-1;
while((c<'0'||c>'9')&&c!='-') c=getchar();
if(c=='-') z=-1,c=getchar();
while(c>='0'&&c<='9') num=(num<<1)+(num<<3)+(c^48),c=getchar();
return z*num;
}
int m,n;
int a;
int tree[2000005];
int lowbit(int x)
{
return x&-x;
}
long long add(int x,int k)
{
while(x<=n)
{
tree[x]+=k;
x+=lowbit(x);
}
}
long long ask(int x)
{
long long ans=0;
while(x!=0)
{
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}
int main(){
n=read();m=read();
int last=0,now;
for(int i=1;i<=n;i++)
{
now=read();
add(i,now-last);
last=now;
}
for(int i=1;i<=m;i++)
{
int o,x,y,k;
o=read();
if(o==1)
{
x=read();y=read();k=read();
add(x,k);
add(y+1,-k);//区间
}
else{
x=read();
cout<<ask(x)<<endl;
}
}
return 0;
}
逆序对
楼兰图图,很经典
for(int i=n;i;i--)
{
ans+=ask(a[i]-1);
add(a[i],1);
}
#include <cstdio>
#include <cstring>
#include <iostream>
#define ll long long
using namespace std;
const int N = 200006;
int n, a[N], c[N], l[N], r[N];
int ask(int x) {
int ans = 0;
while (x) {
ans += c[x];
x -= x & -x;
}
return ans;
}
void add(int x, int y) {
while (x <= n) {
c[x] += y;
x += x & -x;
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
memset(c, 0, sizeof(c));
for (int i = n; i; i--) {
r[i] = ask(a[i] - 1);
add(a[i], 1);
}
memset(c, 0, sizeof(c));
for (int i = 1; i <= n; i++) {
l[i] = ask(a[i] - 1);
add(a[i], 1);
}
ll ans = 0;
for (int i = 1; i <= n; i++)
ans += (ll)(n - i - r[i]) * (i - 1 - l[i]);
cout << ans << " ";
ans = 0;
for (int i = 1; i <= n; i++) ans += (ll)r[i] * l[i];
cout << ans << endl;
return 0;
}
作者:ruanmowen
链接:https://www.acwing.com/activity/content/code/content/323834/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
线段树
注意4倍空间
struct segmentTree
{
int l,r;
int dat;
}t[SIZE*4];
void build(int p,int l,int r)
{
t[p].l=l,t[p].r=r;
if(l==r) {
t[p].dat=a[l];return ;
}
int mid=l+r>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
t[p].dat=t[p*2+1].dat+t[p*2].dat;
}
build(1,1,n);
void change(int p,int x,int v)
{
if(t[p].l==t[p].r)
{
t[p].dat=v;return ;
}
int mid=t[p].l+t[p].r>>1;
if(x<=mid)change(p*2,x,v);
else change(p*2+1,x,v);
t[p].dat=t[p*2].dat+t[p*2+1].dat;
}
change(1,x,v);
细雨斜风作晓寒,
淡烟疏柳媚晴滩。
入淮清洛渐漫漫。
雪沫乳花浮午盏,
蓼茸蒿笋试春盘。
人间有味是清欢。