A.线段树二分
#include<iostream>
#include<algorithm>
#include<cstring>
#define lson u<<1
#define rson u<<1|1
using namespace std;
typedef long long ll;
int n,m;
const int N=100010;
struct Node
{
int l, r;
ll mi;
}tr[N * 4];
int cnt[N];
void pushup(int u)
{
tr[u].mi=min(tr[lson].mi,tr[rson].mi);
}
void build(int u, int l, int r)
{
if (l == r) tr[u] = {l, r,0};
else
{
tr[u] = {l, r,0};
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
// pushup(u);
}
}
void update(int u,int x, ll d)
{
if (tr[u].l== x&& tr[u].r==x)
{
tr[u].mi=d;
cnt[x]++;
}
else
{
int mid = tr[u].l + tr[u].r >> 1;
if (x <= mid) update(u << 1,x, d);
else update(u << 1 | 1,x, d);
pushup(u);
}
}
int query(int u, int l, int r,int v)
{
if(tr[u].mi>v)return 1e9;
if(r<l)return 1e9;
if (tr[u].l==tr[u].r) return tr[u].l;
else
{
int mid = tr[u].l + tr[u].r >> 1;
if (l <= mid ) {
int x=query(u<<1,l,r,v);
if(x!=1e9)return x;
}
if (r > mid){
int x=query(u<<1|1,l,r,v);
if(x!=1e9)return x;
}
}
return 1e9;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;
int res=0;
build(1,1,n);
for(int i=0;i<m;i++){
ll a,b;
cin>>a>>b;
if(tr[1].mi>a)continue;
else{
int c=i%n;
int x=query(1,c+1,n,a);
if(x!=1e9){
update(1,x,a+b);
res=max(res,cnt[x]);
continue;
}
x=query(1,1,c,a);
if(x!=1e9){
update(1,x,a+b);
res=max(res,cnt[x]);
}
}
}
int op=0;
for(int i=1;i<=n;i++)if(cnt[i]==res)op++;
for(int i=1;i<=n;i++){
if(cnt[i]==res){
cout<<i-1;
if(--op)cout<<' ';
}
}
return 0;
}
D.差分+sort+set二分+贪心
#pragma G++ optimize(2)
#pragma G++ optimize(3)
#include <iostream>
#include <cstring>
#include<set>
#include <algorithm>
#define int long long
using namespace std;
typedef long long ll;
const int N=1e5+5;
int pos[N];
int n,m;
struct Node
{
int l,r,c;
bool operator <(Node x)const
{
return c<x.c;
}
}node[N];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T,k=0;
cin>>T;
while(++k<=T)
{
ll s=0;
cin>>n>>m;
int l,r,c;
for(int i=1;i<=m;i++){
cin>>l>>r>>c;
node[i]={l,r,c};
s=s+1ll*(r-l)*(r-l+1)/2*c;
pos[l]++,pos[r+1]--;
}
int t=0,f=0;
cout<<"Case #"<<k<<": ";
for(int i=1;i<=n;i++){
t+=pos[i];
if(t<1){
cout<<"Gotta prepare a lesson";
f=1;
break;
}
}
if(!f){
sort(node+1,node+m+1);
ll ss=0;
set<int> op;
for(int i=1;i<=n;i++)op.insert(i);
for(int i=1;i<=m;i++){
if(!op.size())break;
auto L=lower_bound(op.begin(),op.end(),node[i].l);
if(L==op.end())continue;
auto R=upper_bound(op.begin(),op.end(),node[i].r);
for(auto it=L;it!=R;it++){
ss+=node[i].c;
}
op.erase(L,R);
}
ss-=node[1].c;
// cout<<ss<<"ss";
cout<<s-ss;
}
if(k!=T)cout<<"\n";
for(int i=1;i<=n+1;i++)pos[i]=0;
}
return 0;
}
G,trie+贪心
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N=1e5+5;
int tr[4*N][2];
int idx,n,q;
string res[4*N];
vector<string> op(256);
void init()
{
for(int i=0;i<=255;i++){
string p="";
for(int j=7;j>=0;j--){
if(i>>j&1)p+='1';
else p+='0';
}
op[i]+=p;
}
}
void insert(string s,string v,int c)
{
int p=0;
for(int i=0;i<c;i++){
if(!tr[p][s[i]-'0'])tr[p][s[i]-'0']=++idx;
p=tr[p][s[i]-'0'];
}
res[p]=v;
return ;
}
string query(string s)
{
string ans="";
int p=0;
for(int i=0;i<s.size();i++){
if(tr[p][s[i]-'0']){
p=tr[p][s[i]-'0'];
if(res[p]!="")ans=res[p];
}
else break;
}
if(res[p]!="")ans=res[p];
if(!ans.size())return "1.1.1.1";
return ans;
}
string w(string s)
{
string ans;
int t=0;
for(int i=0;i<s.size();i++){
if(s[i]!='.'){
t=t*10+(s[i]-'0');
}
else{
ans+=op[t];t=0;
}
}
ans+=op[t];
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
init();
cin>>n;
string a,b;
int c;
for(int i=1;i<=n;i++){
cin>>a>>c>>b;
a=w(a);
// cout<<a<<"\n";
insert(a,b,c);
}
cin>>q;
for(int i=1;i<=q;i++){
cin>>a;
a=w(a);
// cout<<a<<"\n";
cout<<query(a);
if(i!=q)cout<<"\n";
}
return 0;
}