1. 程式人生 > >Atcoder 4244 AtCoder Express 2 暴力

Atcoder 4244 AtCoder Express 2 暴力

文章目錄

題意

n,m,q,m.n500,m2×105,q105.n個點並排,給出m個區間,q個詢問,每次詢問m個區間內有多少個區間全部在詢問區間內. \newline n\leq 500,m\leq 2\times10^5,q\leq 10^5.

做法

D題一道,先根據題目難度和分數初步判斷演算法. 400400分. 那麼可以判斷出這是一道水題. 所以莫隊啊線段樹合併啊什麼亂七八糟的高妙演算法也不要用了. 對詢問的每一個區間用v

ectorvector儲存,將右端點push_backpush\_back到左端點所在的vectorvector裡. 然後sortsort每一個vectorvector. 詢問的時候暴力遍歷[l,r][l,r]內的vectorvector,在每一個vectorvector裡二分求出大於rr的最小位置. 減去begin()begin()的迭代器全部相加就是答案.複雜度O(n×q×log(m))O(n\times q\times log(m)),約10001000ms可通過.

#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rel register ll
#define rec register char
#define gc getchar
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
/*By Citrus*/
inline int read(){
  int x=0,f=1;char c=gc(
); for (;!isdigit(c);c=gc()) f^=c=='-'; for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0'); return f?x:-x; } template <typename mitsuha> inline bool read(mitsuha &x){ x=0;int f=1;char c=gc(); for (;!isdigit(c)&&~c;c=gc()) f^=c=='-'; if (!~c) return 0; for (;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^'0'); return x=f?x:-x,1; } template <typename mitsuha> inline int write(mitsuha x){ if (!x) return 0&pc(48); if (x<0) pc('-'),x=-x; int bit[20],i,p=0; for (;x;x/=10) bit[++p]=x%10; for (i=p;i;--i) pc(bit[i]+48); return 0; } inline char fuhao(){ char c=gc(); for (;isspace(c);c=gc()); return c; } }using namespace chtholly; using namespace std; const int yuzu=1e5; vector<int> lj[yuzu|10]; int main(){ int i,j,n,m,q; cin>>n>>m>>q; for (i=1;i<=m;++i) { int l=read(),r=read(); lj[l].push_back(r); } for (i=1;i<=500;++i) sort(lj[i].begin(),lj[i].end()); for (i=1;i<=q;++i){ int l=read(),r=read(),ans=0; for (j=l;j<=r;++j){ ans+=upper_bound(lj[j].begin(),lj[j].end(),r)-lj[j].begin(); } write(ans),pl; } }