題意:給定帶點權和邊權的無向圖,現在讓你選一些點,使得 點權和/被選點對間的邊權和 最大。
思路:不難證明,選擇邊和對應的兩點是最優的。
#include#define rep(i,a,b) for(int i=a;i<=b;i++)using
namespace
std;
const
int maxn=200010
;double
a[maxn],ans;
intmain()
printf(
"%.10lf\n
",ans);
return0;
}
題意:給定a陣列,範圍是1到n;b陣列,是0或者1 。a陣列和b陣列都是隨機的。 然後給定規則,ci=max(aj*bk);滿足i=j+k。現在讓你求c陣列。
思路:如果b的1的個數比較少,比如num=少於100,我們可以直接暴力,複雜度o(num*n); 如果1的個數比較多,那麼我們可以大膽猜測,排名在前面的s個可以去更新很多地方的答案,假設s=40。 那麼只剩下很少的沒有被更新,對於這些,我們去暴力更新即可。 複雜度o(40*n+...)
#include#define ll long long#define rep(i,a,b) for(int i=a;i<=b;i++)
using
namespace
std;
const
int maxn=200010
;int
n,d,a[maxn],b[maxn],c[maxn],tot;
intpos[maxn],ans[maxn],x;
intgetnextx()
intinitab()
rep(i,
0,n-1) swap(b[i],b[getnextx()%(i+1
)]);
}void
get(intp)}
intmain()
else
}rep(i,
0,n-1) if(!ans[i]) get
(i);
}rep(i,
0,n-1) printf("
%d\n
",ans[i]);
return0;
}
題意:有一排物體,一開始顏色分別是1到n。假如乙個物體顏色是col,修改為x,那麼他增加的炫麗度=abs(col-x);現在進行q次操作,1操作是區間修改顏色; 2操作是詢問區間炫麗度之和。(n<1e5);
思路:由於要查詢區間炫麗度,所以還沒法用老司機樹,畢竟odt沒有歷史記錄。 所以我們還是用線段樹,依然是利用其相同線段的勢能關係來解決這個問題。
我們對於顏色相同的區間,可以對其進行lazy操作。 lazy維護乙個顏色,和乙個加的值。 這樣的話,有些中間的變化量就可以不用去考慮了。
#include#define ll long long#define rep(i,a,b) for(int i=a;i<=b;i++)
using
namespace
std;
const
int maxn=400010
;int
col[maxn]; ll add[maxn],sum[maxn];
void build(int now,int l,int
r)
int mid=(l+r)>>1
; build(now
<<1
,l,mid);
build(now
<<1|1,mid+1
,r);
}void pushdown(int now,int l,int
r)
if(add[now])
}void pushup(int
now)
void update(int now,int l,int r,int l,int r,int
x) pushdown(now,l,r);
int mid=(l+r)>>1
;
if(l<=mid) update(now<<1
,l,mid,l,r,x);
if(r>mid) update(now<<1|1,mid+1
,r,l,r,x);
pushup(now);
}ll query(
int now,int l,int r,int l,int
r)int
main()
else printf("
%lld\n
",query(1,1
,n,l,r));
}return0;
}
題意:給定乙個字串s,然後q次詢問,每次詢問給出s和t,|s|,|t|<=4;問包含s和t的最短區間是多長。 |s|<5e4。
思路:我們可以把s的所有長度為1到4的子串都提出來,(由於不長感覺不會出現碰撞,單hash就夠了)。
然後對於每次詢問,我們可以對含s的部分,和含t的部分找最近的地方。即兩個集合,在屬於不同集合的最近的點對,這裡可以用雙指標做到線性,單次的複雜度和較小的集合大小有關。 同時,用map記錄一下,避免多次出現極端資料。
#include#define pii pair#define rep(i,a,b) for(int i=a;i<=b;i++)using
namespace
std;
const
int maxn=2000010
;map
int>mp;
vector
g[maxn];
char
c[maxn],a[maxn],b[maxn];
intmain()
scanf("%d
",&q);
while(q--)
int sz1=g[ta].size(),sz2=g[tb].size();
int p1=0,p2=0
;
while(p1sz2)
if(p2g[ta][p1]);
p1++;
}p1=p2=0
;
while(p1sz2)
if(p1g[tb][p2]);
p2++;
}if(ans==maxn) ans=-1
; mp[pii(ta,tb)]=ans;
printf(
"%d\n
",ans);
}return0;
}
CF453 Div1 簡單題解
pro 給定m,n,表示乙個m面的骰子,甩n次,問出現的最大的數的期望。sol 容斥,f i 表示最大數 i的期望,那麼最大數 x的期望就是f x f x 1 include define rep i,a,b for int i a i b i using namespace std const i...
CF 120F Spider 樹的直徑 簡單題
乙個男孩有n只玩具蜘蛛,每只蜘蛛都是乙個樹的結構,現在男孩準備把這n只小蜘蛛通過貼上節點接在一起,形成乙隻大的蜘蛛。大的蜘蛛也依然是樹的結構。輸出大的蜘蛛的直徑。知識 樹的直徑是指樹上的最長簡單路 求樹的直徑有個結論 假設s t這條路徑為樹的直徑,或者稱為樹上的最長路。從任意一點u出發搜到的最遠的點...
CF竟然綠掉了 這學期的目標是DIV1
c題沒出來。昨天cf竟然綠了。竟然綠了。好吧,今年的目標就是紫色,我要進div1!首先自己的dp貪心2分這樣的題目得拿下,然後資料結構圖論的題目,然後才是數學題。今年的目標就是這樣了。昨天的c題沒做出來,首先就是因為這種需要變形構造的題目自己做的太少了。另外這也算是一道資料結構題目。當然也是比較水了...